【Leetcode】合并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 };

 

posted @ 2020-03-17 22:10  甜酒果。  阅读(131)  评论(0编辑  收藏  举报