1. 程式人生 > >#21 合並排序後的兩個鏈表

#21 合並排序後的兩個鏈表

使用 ext 小技巧 鏈表 合並 lists urn amp 冗余

思路

使用三個遊標:cur指向合並後鏈表的尾部,l1,l2分別用於遍歷兩個鏈表,較小的元素增加到合並後鏈表。

小技巧

使用冗余的頭結點可以精簡地判斷一下情形,其中一個鏈表,或兩個都為空鏈表。

從而精簡代碼。

樸素代碼

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode * head, *ptr;
        
        if (!l1 && !l2) return NULL;
        if (!l1 && l2)  return
l2; if (l1 && !l2) return l1; if (l1->val > l2->val) { head = l2; l2 = l2->next; } else { head = l1; l1 = l1->next; } ptr = head; while (l1 && l2) { if
(l1->val <= l2->val) { ptr->next = l1; l1 = l1->next; } else { ptr->next= l2; l2 = l2->next; } ptr = ptr->next; } if (l1) { ptr->next = l1; }
else { ptr->next = l2; } return head; } };

優化代碼

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode dummy(0);
        ListNode *ptr = &dummy;
        while (l1 && l2) {
            if (l1->val <= l2->val) {
                ptr->next = l1;
                l1 = l1->next;
            } else {
                ptr->next= l2;
                l2 = l2->next;
            }
            ptr = ptr->next;
        }
        
        if (l1) {
            ptr->next = l1;
        } else {
            ptr->next = l2;
        }
        
        return dummy.next;
    }
};

#21 合並排序後的兩個鏈表