题目链接:合并K个排序链表
题意:合并k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
题解:这题的前身是合并两个排序链表。在剑指里有写。可以点击链接查看。。
这个题,最好就是用小顶堆,O(nlog(K))。用c++的优先队列可以解决这个小顶堆。
把每个节点丢进优先队列,然后以出队列的顺序作为新链表顺序
代码:
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 //优先队列重载cmp函数 12 struct cmp{ 13 bool operator()(ListNode* a,ListNode* b){ 14 return a->val > b->val; //小顶堆 15 } 16 }; 17 18 ListNode* mergeKLists(vector<ListNode*>& lists) { 19 priority_queue<ListNode* ,vector<ListNode*> , cmp> que; 20 for(auto head:lists){ 21 if(head) que.push(head); 22 } 23 24 ListNode* ans = new ListNode(0); 25 ListNode* res = ans; 26 27 while(!que.empty()){ 28 ListNode* p = que.top(); 29 que.pop(); 30 if(p->next){ 31 que.push(p->next); 32 } 33 res->next = p; 34 res = res->next; 35 } 36 return ans->next; 37 } 38 };