LeetCode 23

https://leetcode.cn/problems/merge-k-sorted-lists/description/

难度:困难

本题是最小堆的题目。首先将 k 个链表的头节点加入堆,每次在链表中插入堆顶元素,再把堆顶元素的下一个元素入堆。

需要注意的是最小堆的声明方式。a > b(greater)是最小堆,a < b(less) 是最大堆。STL 的优先队列默认是最大堆。

auto cmp = [](const ListNode* a, const ListNode* b) {
    return a->val > b->val;
};
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq;

时间复杂度:O(Llogm),其中 m 为 lists 的长度,L 为所有链表的长度之和。

空间复杂度:O(m)。堆中至多有 m 个元素。

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int n = lists.size();
        ListNode* dummy = new ListNode();
        ListNode* cur = dummy;

        auto cmp = [](const ListNode* p, const ListNode* q) {
            return p->val > q->val;
        };
        priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq;

        for (auto head : lists) {
            if (head) {
                pq.push(head);
            }
        }

        while (pq.size() > 0) {
            ListNode* node = pq.top();
            pq.pop();
            cur->next = node;
            cur = cur->next;
            if (node->next) {
                pq.push(node->next);
            }
        }
        return dummy->next;
    }
};