题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
Accepted C++ Solution:
使用优先级队列
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct cmp {
bool operator() (ListNode *a, ListNode *b) {
return a->val > b->val; //小的优先级更高
}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, cmp> q; //基于向量的优先级队列
ListNode* pre = new ListNode(-1);
ListNode* tmp = pre;
for (int i = 0; i < lists.size(); i++)
{
if (lists[i])
q.push(lists[i]); //将所有节点放入优先级队列
}
while(!q.empty())
{
ListNode* t = q.top();
q.pop();
if (t->next)
q.push(t->next); //只需要链表最小的元素,把后续节点重新推回队列
tmp->next = t;
tmp = tmp->next; //tmp = t
}
tmp = pre->next;
delete pre;
return tmp;
}
};