给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
方法1:堆
先把每个链表数组的头节点入堆(小顶堆/小根堆),然后出堆,出堆之后,哪个数组的头节点先出堆,就要补充哪个数组的头节点。就这样一直补充下去,知道所有的节点被遍历完。
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto cmp = [](const ListNode *a, const ListNode *b){
return a->val > b->val;
};
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq;
for (auto head: lists)
if (head) pq.push(head);
auto dummy = new ListNode();
auto cur = dummy;
while (!pq.empty()){
auto node = pq.top();
pq.pop();
if (node->next)
pq.push(node->next);
cur->next = node;
cur = cur->next;
}
return dummy->next;
}
};