LeetCode-23. 合并 K 个升序链表

问题分析

  1. 先建立一个小顶堆
  2. 将每一路的最小元素都加入小顶堆,此时堆顶元素就是全局的最小值
  3. 将堆顶元素弹出。若堆顶元素所在的数组不为空,则将下一元素加入堆中
  4. 重复2、3操作,直到所有数据都读取完毕
  5. 将堆内元素按顺序读出,并清空堆内元素

复杂度分析

建堆操作的时间复杂度: O ( l o g k ) O(logk) O(logk)

  • 递归式: T ( k ) = 2 T ( k / 2 ) + l o g n T(k) = 2T(k/2) + logn T(k)=2T(k/2)+logn,可以用主定理得出上述建堆操作的时间复杂度

单次插入操作的时间复杂度: O ( l o g k ) O(logk) O(logk)

返回堆顶元素的时间复杂度: O ( 1 ) O(1) O(1)

删除堆顶元素的时间复杂度: O ( l o g k ) O(logk) O(logk)

整体的时间复杂度: O ( n l o g k ) O(nlogk) O(nlogk)

程序代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
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)> q;
        // 初始化小顶堆
        for(int i = 0; i < lists.size(); i++) {
   
            if( lists[i] )  q.push(lists[i]);
        }
        ListNode* dummy = new ListNode();
        ListNode* head = dummy;
        while( !q.empty() ) {
   
            auto node = q.top();
            q.pop();
            head -> next = node;
            if( node -> next ) {
   
                node = node -> next;
                q.push(node);
            }
            head = head -> next;
        }
        return dummy -> next;
    }
};

相关推荐

  1. LeetCode-23. 合并 K 升序

    2023-12-14 16:38:02       44 阅读
  2. LeetCode-23 合并 K 升序

    2023-12-14 16:38:02       64 阅读
  3. LeetCode 23 合并 K 升序

    2023-12-14 16:38:02       60 阅读
  4. LeetCode23.合并K升序

    2023-12-14 16:38:02       45 阅读
  5. 23. 合并 K 升序 - 力扣(LeetCode)

    2023-12-14 16:38:02       41 阅读
  6. Leetcode 23. 合并 K 升序【困难】

    2023-12-14 16:38:02       40 阅读
  7. leetcode热题HOT 23. 合并 K 升序

    2023-12-14 16:38:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 16:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 16:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 16:38:02       82 阅读
  4. Python语言-面向对象

    2023-12-14 16:38:02       91 阅读

热门阅读

  1. Docker 打包容器成镜像

    2023-12-14 16:38:02       45 阅读
  2. 基于libevent使用c语言实现http服务端的基础框架

    2023-12-14 16:38:02       59 阅读
  3. ERP 系统开源

    2023-12-14 16:38:02       67 阅读
  4. I_love_%username%

    2023-12-14 16:38:02       61 阅读
  5. Jtti:Windows磁盘阵列掉盘如何修复

    2023-12-14 16:38:02       53 阅读
  6. 虚幻商城 蓝图汇总

    2023-12-14 16:38:02       59 阅读
  7. Codeforces Round 787 (Div. 3)D. Vertical Paths

    2023-12-14 16:38:02       66 阅读
  8. 【Clickhouse】float 计算误差

    2023-12-14 16:38:02       54 阅读