剑指offer——合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表的结点定义如下:

struct ListNode
{
	int val;
	ListNode* next;
};

例如输入如图所示的链表1和链表2,合并之后为链表3:

链表1:

链表2:

链表3:

这是一个经常被各公司采用的面试题。在面试过程中,最容易犯的两个错误是:

  1. 合并出来的链表要么中间断了,要么并没有做到递增排序
  2. 程序一旦有特殊输入就会崩溃

首先分析合并两个链表的过程:

(1)链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点是合并后的链表的头结点。

(2)在剩余的结点中,链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点是剩余结点的头结点,把这个结点和之前已经合并好的链表的尾结点连接起来。

我们继续合并两个链表中剩余的结点,在两个链表中剩余的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。这就是典型的递归过程,我们可以定义递归函数完成这一合并过程。

注意:本题一旦引入空链表就会引入空指针,因此我们要对空链表进行单独处理。

参考代码如下:

 ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1 == NULL)
            return pHead2;
        if(pHead2 == NULL)
            return pHead1;
        ListNode* MergeHead = NULL;
        if(pHead1->val < pHead2->val)
        {
            MergeHead = pHead1;
            MergeHead->next = Merge(pHead1->next,pHead2);
        }
        else
        {
            MergeHead = pHead2;
            MergeHead->next = Merge(pHead1,pHead2->next);
        }
        return MergeHead;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值