【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 };