leetcode23 合并k个排序链表(Hard)
题目来源:leetcode23 合并k个排序链表
题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解题思路:
用优先队列实现最小堆。将每个链表的第一个结点加入最小堆中,不断去最小堆的堆顶,就是最小元素,再把最小元素所在链表的下一个结点加入堆中,维护堆的特性,直到所有链表的结点都被取出。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp {
bool operator()(ListNode *l1,ListNode *l2) const{
return l1->val>l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*,vector<ListNode*>,cmp> pq;//最小堆
for(int i=0;i<lists.size();i++){
if(lists[i])
pq.push(lists[i]);
}
ListNode *ans=new ListNode(-1);
ListNode *temp=ans;
while(!pq.empty()){
ListNode *t=pq.top();
temp->next=t;
temp=temp->next;
pq.pop();
if(t->next) pq.push(t->next);
}
return ans->next;
}
};