地址 https://leetcode-cn.com/problems/merge-k-sorted-lists/
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4
解答
最原始的想法就是
1 每次遍历所有链表 找出链表头数据最小的那个链表a
2 取出链表a的第一个最小树存储,然后从链表a删除该数据。再次进入遍历所有链表 找出最小数据链表的过程1
循环直到所有链表为空 . 假设链表为k项 时间复杂度为O(km)
优化办法
每次遍历都是为了寻找链表头数值最小的链表
那么我们使用最小堆来存储链表头,每次链表头数值最小的链表在堆顶端,可以节省每次遍历的时间。 复杂度为O(m*logK)
class Solution {
public:
struct cmp {
bool operator ()(ListNode *a, ListNode* b) {
return a->val > b->val;//最小值优先
}
};
priority_queue<ListNode*, vector<ListNode*>, cmp > Q;
ListNode* mergeKLists(vector<ListNode*>& lists) {
for (auto& e : lists) {
if(e!=NULL)
Q.push(e);
}
ListNode* ans = new ListNode(-999999);
ListNode* p = ans;
while (!Q.empty()) {
ListNode* curr = Q.top();
Q.pop();
p->next = new ListNode(curr->val);
curr = curr->next;
if (curr != NULL) {
Q.push(curr);
}
p = p->next;
}
return ans->next;
}
};