36. 合并两个排序的链表

36. 合并两个排序的链表_第1张图片

 

 算法
(二路归并) 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<//cout << l2->val <//cout << cur->val <
        cur->next = (l1==NULL ? l2 : l1);
        return dummy->next;
        
    }  
};

36. 合并两个排序的链表_第2张图片

 

你可能感兴趣的:(36. 合并两个排序的链表)