Skip to content

Latest commit

 

History

History
71 lines (61 loc) · 2.49 KB

023.md

File metadata and controls

71 lines (61 loc) · 2.49 KB

23. Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

#解析 要合并k个有序链表l1, l2, l3,...lk,我们只需两两合并。比如先l1 和 l2合并,然后用此合并后的链表和l3进行合并。 在已经实现了Merge Two Sorted Lists的基础上,完成此题不算太难。 值得思考的地方在于怎么觉得合并的顺序,即先合并哪两个链表,合并后的链表再怎么处理。

##解法一 先合并第一个和最后一个链表,并将合并后的链表保存在第一个链表中。左右链表同时向中间靠拢。 这样一来,一次循环之后,前半部分的链表保存了两两合并后的新链表。 我们再在前半部分的链表中,重复上述动作。直到只剩一个链表,即为所求结果。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge2Lists(ListNode* l1, ListNode* l2){
        if(NULL == l1) return l2;
        else if(NULL == l2) return l1;
        
        if(l1->val < l2->val){
            l1->next = merge2Lists(l1->next, l2);
            return l1;
        }
        else {
            l2 -> next = merge2Lists(l2->next, l1);
            return l2;
        }
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty()) return NULL;
        int len = lists.size();
        while(len > 1){
            for(int i = 0; i < len / 2; ++i){
                lists[i] = merge2Lists(lists[i], lists[len - 1 -i]);
            }
            len = (len + 1) / 2;
        }
        
        return lists.front();
    }
};

##解法二

vector<ListNode*>& lists 中保存了所有链表,我们先合并前两个链表,并将结果插入到lists后面,同时删除前两个链表,以此循环,直到lists中只保存了一个链表为止。

ListNode *mergeKLists(vector<ListNode *> &lists) {
    if(lists.empty()){
        return nullptr;
    }
    while(lists.size() > 1){
        lists.push_back(merge2Lists(lists[0], lists[1]));
        lists.erase(lists.begin());
        lists.erase(lists.begin());
    }
    return lists.front();
}