【34】23. Merge k Sorted Lists

23. Merge k Sorted Lists

  • Total Accepted: 128694
  • Total Submissions: 492365
  • Difficulty: Hard
  • Contributors: Admin

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

 Solution 1:最小堆

利用了最小堆这种数据结构,我们首先把k个链表的首元素都加入最小堆中,它们会自动排好序。然后我们每次取出最小的那个元素加入我们最终结果的链表中,然后把取出元素的下一个元素再加入堆中,下次仍从堆中取出最小的元素做相同的操作,以此类推,直到堆中没有元素了,此时k个链表也合并为了一个链表,返回首节点即可。

 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 struct cmp{
10   bool operator() (ListNode* a, ListNode* b){
11       return a -> val > b -> val;//最小堆
12   }  
13 };
14 
15 class Solution {
16 public:
17     ListNode* mergeKLists(vector<ListNode*>& lists) {
18         priority_queue<ListNode*, vector<ListNode*>, cmp> q;//声明的写法!
19         for(int i = 0; i < lists.size(); i++){
20             if(lists[i]){
21                 q.push(lists[i]);//先把链表队首加入最小堆,自动排序
22             }
23         }
24         ListNode* head = NULL, *pre = NULL, *tmp = NULL;//要声明为空!
25         while(!q.empty()){
26             tmp = q.top();//priority_queue.top()
27             q.pop();
28             if(!pre) head = tmp;
29             else pre -> next = tmp;
30             pre = tmp;
31             if(tmp -> next){
32                 q.push(tmp -> next);
33             }
34         }
35         return head;
36     }
37 };

 

 

 

 

 

 

 

 

 

 

 

posted @ 2017-02-08 11:31  会咬人的兔子  阅读(112)  评论(0编辑  收藏  举报