@LeetCode合并K个排序链表--Merge k Sorted Lists[C++]
问题描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[1->4->5, 1->3->4, 2->6 ]
输出:
1->1->2->3->4->4->5->6
解决方法及复杂度分析
思路
打算利用 最小堆 数据结构去完成这道题。在 C++ 中,我们利用 优先队列 priority_queue 去实现最小堆。
我们将输入的链表中各个结点压入优先队列中,按照从小到大的顺序保存。
为了避免处理头结点为空的边界问题,我们建立一个哑结点。
只要优先队列不为空,我们依次取出前段结点并删除,当前结点指向此结点,并设置此结点为当前结点。如果下一结点不为空,我们将其压入优先队列中。
复杂度分析
- 时间复杂度:
O
(
n
)
O(n)
O(n)
n 是 k 个有序链表的长度之和。
程序实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto cmp = [](ListNode*& a, ListNode*& b) {
return a->val > b->val;
};
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> q(cmp);
for (auto node : lists) {
if (node) q.push(node);
}
ListNode* dummy = new ListNode(0), *cur = dummy;
while (!q.empty()) {
auto t = q.top(); q.pop();
cur->next = t;
cur = cur->next;
if (cur->next) q.push(cur->next);
}
return dummy->next;
}
};
@北京·怀柔 2019.3.8