【LeetCode】023. Merge k Sorted Lists

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

 

题解:

  归并思想。

Solution 1

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* mergeKLists(vector<ListNode*>& lists) {
12         int n = lists.size();
13         if (n < 1)
14             return nullptr;
15         
16         for (int i = 1; i < n ; i *= 2) {
17             int len = i;
18             for (int j = 0; j + len < n; j += 2 *len) {
19                 lists[j] = mergeTwoLists(lists[j], lists[j + len]);
20             }
21         }
22         
23         return lists[0];
24     }
25     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
26         ListNode dummy(-1);
27         ListNode *cur = &dummy;
28         while (l1 && l2) {
29             if (l1->val < l2->val) {
30                 cur->next = l1;
31                 l1 = l1->next;
32             } else {
33                 cur->next = l2;
34                 l2 = l2->next;
35             }
36             cur = cur->next;
37         }
38         cur->next = l1 ? l1 : l2;
39         
40         return dummy.next;
41     }
42 };

 

Solution 2

  利用最小堆,c++的优先队列priority_queue。

 1 class Solution {  
 2 public:  
 3     struct cmp {
 4         bool operator () (ListNode *a, ListNode *b) {
 5             return a->val > b->val;
 6         }
 7     };
 8     ListNode *mergeKLists(vector<ListNode *> &lists) {  
 9         priority_queue<ListNode*, vector<ListNode*>, cmp> q;
10         for (auto list : lists) {
11             if (list)  
12                 q.push(list);
13         }
14         
15         ListNode *head = NULL, *pre = NULL, *tmp = NULL;
16         while (!q.empty()) {
17             tmp = q.top();
18             q.pop();
19             if (!pre) 
20                 head = tmp;
21             else 
22                 pre->next = tmp;
23             pre = pre->next;
24             // 此节点所在数组仍有元素,则添加进最小堆中
25             if (tmp->next) 
26                 q.push(tmp->next);
27         }
28         return head;
29     }  
30 };

转自:Grandyang

 

posted @ 2018-03-25 21:56  Vincent丶丶  阅读(137)  评论(0编辑  收藏  举报