链接
题目
合并k个升序链表
思路
合并,两个的很简单,双指针跑一下。
k个的话,想法是k个指针,每轮跑k次,取最小值插入答案链表,但这样不优,遍历k个只取了一个出来放进结果中,时间复杂度是k*所有的节点个数。
考虑如何快速获取k个中的最小值,可以想到小顶堆。
用优先队列维护k个节点,每次取堆顶,然后加入改链表的下一个节点进入堆中即可。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
struct node{
int val;
ListNode* ptr;//当前节点的指针
bool friend operator < (const node &a, const node &b) {
return a.val > b.val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue <node> que;
for(auto i : lists){
if(i){
que.push(node{i -> val, i});
}
}
ListNode head, *tail = &head;
while(!que.empty()){
node tem = que.top();
que.pop();
tail -> next = tem.ptr;
tail = tail -> next;
if(tem.ptr -> next){
que.push(node{tem.ptr -> next -> val, tem.ptr -> next});
}
}
return head.next;
}
};