36. 合并两个排序的链表

 算法
(二路归并) 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;
        
    }  
};

带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
原文地址:https://www.cnblogs.com/make-big-money/p/12306045.html