Merge k Sorted Lists

標簽: C++ 算法 LeetCode 鏈表

每日算法——leetcode系列


問題 Merge Two Sorted Lists

Difficulty: Easy

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        
    }
};

翻譯

合并兩個有序鏈表

難度系數:簡單

合并兩個有序鏈表并返回一個新鏈表。新的鏈表的由兩個有序的鏈表的節點組成。

思路

兩種思考方式:

  • 先定一個主鏈表,把另一個鏈表合并到這個主鏈表
    假定一個鏈表dummy, 為方便遍歷,設dummy的初始值為-1,next指向l1(主鏈表),為返回值,還得新那家一個鏈表tempLink = dummy

  • 如果l1的值比l2小,templink = l1, 再遍歷l1->next

  • 如果l1的值比l2大,則把temlink->next = l2, tempLink = tempLink->next, 再把tempLink批回主鏈表, 這樣到最后有可能副鏈表還不為空,再加到后面就好

  • 直接同時遍歷兩個鏈表,再每次取其中小的
    這種思路比較直接,就是同時遍歷兩個鏈表, 哪個小用哪個, 再把剩下的放到最后

代碼

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *p1 = l1,  *p2=l2;
        ListNode dummy(-1);
        dummy.next = p1;
        ListNode *tempLink = &dummy;
        
        while(p1 != nullptr && p2 != nullptr) {
            if (p1->val < p2->val) {
                tempLink = p1;
                p1 = p1->next;
            } else {
                tempLink->next = p2;
                p2 = p2->next;
                tempLink = tempLink->next;
                tempLink->next = p1;
            }
        }
        if (p2 != nullptr) {
            tempLink->next = p2;
        }
        
        return dummy.next;
    }
    
    ListNode* mergeTwoLists2(ListNode* l1, ListNode* l2) {
        ListNode *p1 = l1,  *p2=l2;
        ListNode dummy(-1);
        dummy.next = nullptr;
        ListNode *tempLink = &dummy;
        
         while(p1 != nullptr && p2 != nullptr) {
            if (p1->val < p2->val) {
                tempLink->next = p1;
                p1 = p1->next;
                tempLink = tempLink->next;
            } else {
                tempLink->next = p2;
                p2 = p2->next;
                tempLink = tempLink->next;
            }
        }
        if (p2 != nullptr) {
            tempLink->next = p2;
        } else if ( p1 != nullptr) {
            tempLink->next = p1;
        }
        
        return dummy.next;
    }

};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容