📌  相关文章
📜  合并 K 个已排序链表的 C++ 程序 – 第 1 组(1)

📅  最后修改于: 2023-12-03 14:50:39.817000             🧑  作者: Mango

合并 K 个已排序链表的C++程序 - 第1组

简介

合并k个已排序的链表,并返回合并后的链表。假设输入的k个链表都是已排序的。

解题思路
  1. 取出每个链表的头节点,将它们放入最小堆。
  2. 从堆中取出一个节点,将其接到结果链表的末尾,然后将该节点的下一个节点放入堆中。
  3. 重复第2步,直到堆为空。
代码实现
/**
 * 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) {
        priority_queue<ListNode*, vector<ListNode*>, cmp> q;
        for (int i = 0; i < lists.size(); ++i) {
            if (lists[i]) q.push(lists[i]);
        }
        ListNode* dummy = new ListNode(-1);
        ListNode* cur = dummy;
        while (!q.empty()) {
            ListNode* node = q.top();
            q.pop();
            cur->next = node;
            cur = cur->next;
            if (node->next) q.push(node->next);
        }
        return dummy->next;
    }

private:
    struct cmp {
        bool operator() (ListNode* a, ListNode* b) {
            return a->val > b->val;
        }
    };
};
复杂度分析
  • 时间复杂度:O(NlogK),其中K是链表的数量,N是所有链表中元素的总数。在最坏的情况下,堆需要进行的操作次数为NlogK,因此总的时间复杂度为O(NlogK)。
  • 空间复杂度:O(K),即堆的大小。
总结

该算法的关键在于使用了最小堆来找到当前k个节点中的最小节点。因此时间复杂度比较优秀。