首页 > 编程语言 > 详细

36. 合并两个排序的链表

时间:2020-02-14 09:32:24      阅读:81      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 算法
(二路归并) O(n)

    1.新建头部的保护结点dummy,设置cur指针指向dummy。
    2.若当前l1指针指向的结点的值val比l2指针指向的结点的值val小,则令cur的next指针指向l1,且l1后移;否则指向l2,且l2后移。
    3.然后cur指针按照上一部设置好的位置后移。
   4.循环以上步骤直到l1或l2为空。
   5.将剩余的l1或l2接到cur指针后边。

时间复杂度

两个链表各遍历一次,所以时间复杂度为O(n)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
        while(l1 && l2){
            if(l1->val < l2->val) 
            {
                cur->next = l1;
                l1 = l1->next;
            }
            else 
            {
                cur->next = l2;
                l2 = l2->next;
            }
            cur = cur->next;//指完之后把cur向后移动一个
        }
        //判断是l1空了,还是l2空了,再把剩下的链表元素拼上。怎么拼?一个一个拼上?
        //看了代码,直接是通过cur->next把剩下的元素拼接上了
        //cur -> next = (l1 != NULL ? l1 : l2);
        //cout<<l1<<endl;
        //cout << l2->val <<endl;
        //cout << cur->val <<endl;
        cur->next = (l1==NULL ? l2 : l1);
        return dummy->next;
        
    }  
};

技术分享图片

 

36. 合并两个排序的链表

原文:https://www.cnblogs.com/make-big-money/p/12306045.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!