题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表的结点定义如下:
struct ListNode
{
int val;
ListNode* next;
};
例如输入如图所示的链表1和链表2,合并之后为链表3:
链表1:
链表2:
链表3:
这是一个经常被各公司采用的面试题。在面试过程中,最容易犯的两个错误是:
- 合并出来的链表要么中间断了,要么并没有做到递增排序
- 程序一旦有特殊输入就会崩溃
首先分析合并两个链表的过程:
(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;
}