23. Merge k Sorted Lists

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

分析

算法1:
类似于归并排序,将Merge k 个的问题,拆分成Merge 2 个的子任务,然后递归回溯。
算法复杂度 O(nlogn)

算法2:

使用最小堆。
维护一个最大 大小 k 的最小堆,每次从堆顶pop出元素放到结果中,并将该元素的next(如果有)push到最小堆中。最小堆构建O(klogk),然后所有的元素都要被插入最小堆,pop耗时O(1)。所以算法时间复杂度 O(nklogk):n,list最长为n;最小堆最大为k。

代码


方法一:
假设总共有k个list,每个list的最大长度是n,那么运行时间满足递推式T(k) = 2T(k/2)+O(n*k)。空间复杂度的话是递归栈的大小O(logk)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size() == 0)
            return NULL;
        return helper(lists, 0, lists.size() - 1);
    }
    ListNode * helper(vector<ListNode*> &lists, int l, int r){
        if(l < r){
            int m = (l + r) >> 1;
            return mergeTwoLists(helper(lists,l,m), helper(lists,m+1,r));
        }
        return lists[l];
    }
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode tmp(INT_MIN);
        ListNode * l3 = &tmp;
        while(l1 && l2){
            if(l1 -> val > l2 -> val){
                l3 -> next = l2;
                l2 = l2 -> next;
            }
            else{
                l3 -> next = l1;
                l1 = l1 -> next;
            }
            l3 = l3 -> next;
        }
        l3 -> next = l1 == NULL? l2 : l1;
          
        return tmp.next;
    }
};

方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    struct Mycompare{
        bool operator()(ListNode * a, ListNode * b){
            return a->val > b->val;
        }
    };
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode *, vector<ListNode*>, Mycompare> min_heap;
        for(auto l : lists) {
            if(l)  min_heap.push(l);
        }
        if(min_heap.empty()) return NULL;
         
        ListNode result(0);
        ListNode * tmp = &result;
        while(!min_heap.empty()){
            tmp->next = min_heap.top();
            tmp = tmp->next;
            min_heap.pop();
            if(tmp->next != NULL){
                min_heap.push(tmp->next);
            }
 
        }
         
        return result.next;
         
    }
};






posted @ 2017-01-13 14:03  copperface  阅读(245)  评论(0编辑  收藏  举报