面试题25. 合并两个排序的链表

题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

限制:
0 <= 链表长度 <= 1000
链表结构:

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x),next(NULL) {} };

解题思路:

    • (一)循环
    • (二)递归

(一)循环

因为需要生成一个全新的链表,那么我们就重新创建一个链表来保存递增排序链表,然后每次将两个链表中较小的数值连接到新链表后面即可,但我们需要注意几个点:

  • 生成新链表结点是: ListNode* head=new ListNode(1),伪头节点,生成一个指向链表的指针: ListNode* res=head,一定要注意区分。
  • 注意处理空链表的情况,共三种,L1空,则返回L2;L2空则返回L1;均空返回null。
  • while循环不断进行比较连接,如果L1==NULL && L2==NULL则跳出循环。
  • res->next=小的数,这就连接到head上了,res再指向新连接上的节点,res=res->next,这样下次就是在新的后面了。
  • 如果L1,L2两个链表任何一个结束了,则直接将另一个连接到新链表后面。
  • 最后我们需要返回head->next,而不是head,因为这个头节点是我们不需要的。
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) 
{
        if(l1==NULL)//空链表处理
        {
            return l2;
        }
        if(l2==NULL)
        {
            return l1;
        }
        ListNode* head=new ListNode(0);//申请头节点
        ListNode* res=head;//指向头节点的指针
        while(l1!=NULL && l2!=NULL)//循环条件
        {
            if(l1->val > l2->val)
            {
               res->next=l2;//连接
               res=res->next;//z指向新连接的
               l2=l2->next;
            }
            else
            {
                res->next=l1;
                res=res->next;
                l1=l1->next;
            }   
        }
        if(l1==NULL)
        {
            res->next=l2;//把剩下的连接上
        }
        if(l2==NULL)
        {
            res->next=l1;
        }
        return head->next;//不需要头节点
}

(二)递归

循环都是可以写为递归的,我们从上面的代码分析出来递归条件,递归内容等:

  • 递归条件:那就是两个链表不为空,L1!=NULL,L2!=NULL;
  • 递归内容:新链表头节点的确定:第一次比较最小的给他,如head=L1,之后每次得到最小的节点,连接到head后面,L1或L2向前走一步
  • 最后返回新链表head,注意这时候不是head->next,因为我们头节点不是假的,而是L1或L2的开头节点。
   ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) 
   {
        if(l1==NULL)
        {
            return l2;
        }
        if(l2==NULL)
        {
            return l1;
        }
        ListNode* head=NULL;
        if(l1->val > l2->val)
        {
            head=l2;//l2比较小,所以为l2为新链表的头节点
            head->next=mergeTwoLists(l1,l2->next);//递归,每次把小的连接到头节点后面
        }
        else
        {
            head=l1;
            head->next=mergeTwoLists(l1->next,l2);
        }
        return head;
    }

加油哦!。

你可能感兴趣的:(剑指offer习题练习)