地址:https://leetcode.com/problems/merge-k-sorted-lists/
题目:
Merge k k k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:

理解:
合并k个有序链表。想到了外部排序里面的败者数,其本质也是一个堆。因此,把k个链表的头结点加到一个小根堆里,然后把堆顶弹出,并把堆顶的下一个结点加入。
实现:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto comp = [](const ListNode* lhs, const ListNode* rhs) {return lhs->val > rhs->val; };
priority_queue<ListNode*, vector<ListNode*>, decltype(comp)> q(comp);
for (auto p : lists)
if (p)
q.push(p);
if (q.empty()) return nullptr;
ListNode* head = q.top();
q.pop();
if (head->next)
q.push(head->next);
ListNode* p = head;
while (!q.empty()) {
p->next = q.top();
q.pop();
p = p->next;
if (p->next) q.push(p->next);
}
return head;
}
};
本文介绍了一种使用小根堆实现的算法,用于合并k个有序链表为一个有序链表。通过将链表头结点加入堆中,不断弹出最小元素并将其下一个结点加入堆,直至所有结点被处理。
&spm=1001.2101.3001.5002&articleId=85195403&d=1&t=3&u=b9d69e95ad3b415aa44f128a12006d4e)
373

被折叠的 条评论
为什么被折叠?



