Leetcode 23. 合并K个排序链表

STC15W204S最小系统开发指南:从串口通讯到自动热加载全流程 本文详细介绍了STC15W204S最小系统的完整开发流程。从芯片资源解析、最小系统搭建、串口通讯驱动编写(使用Timer2生成波特率),到实现基于魔术值触发的自动热加载功能,并最终集成Keil与STC-ISP软件,构建高效的自动化开发工作流,显著提升嵌入式调试效率。 阅读详情

题目

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

解答

解法一:逐个遍历解法 O(nk)

思路很简单,看主函数就行了。

如果 lists 不是空,就弹出一个最小的结点。

时间复杂度是最高的:O(nk) 的时间, O(1) 的空间

代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        
        while(!isEmpty(lists)) {
            // 选择一个最小的结点
            cursor.next = popMin(lists);
            cursor = cursor.next;
        }
        
        return root.next;
    }
    
    private boolean isEmpty(ListNode[] lists) {
        for(int i = 0; i < lists.length; i ++) {
            if(lists[i] != null) return false;                    
        }
        
        return true;
    }
    
    private ListNode popMin(ListNode[] lists) {
        ListNode min = null;
        int index = -1;
        for(int i = 0; i < lists.length; i ++) {
            if(lists[i] == null) continue;
            
            if(min == null || lists[i].val < min.val) {
                min = lists[i];
                index = i;
            }
        }
        
        lists[index] = min.next;
        return min;
    }
}


结果

在这里插入图片描述

解法二:暴力排序解法 O(nlogn)

具体步骤:

  1. 首先将所有链表的数据提取出来,放入到一个 List 容器中。

  2. 对 List 容器的内容自然排序(即升序),时间复杂度 O(nlogn)

  3. 对已经排序的 List 容器内的数据重新组装成链表结构

复杂度:O(nlogn) 的时间, O(n) 的空间

代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        List<Integer> datas = new ArrayList<>();
        // 先采集数据
        for(int i = 0; i < lists.length; i ++) {
            ListNode cur = lists[i];
            while(cur != null) {
                datas.add(cur.val);
                cur = cur.next;
            }
        }
        
        // 自然排序(升序)
        Collections.sort(datas);
       	
        // 重新组装链表
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        for(int i = 0; i < datas.size(); i ++) {
            cursor.next = new ListNode(datas.get(i));
            cursor = cursor.next;
        }
        
        return root.next;
    }
}
结果

在这里插入图片描述

解法三:小顶堆解法 O(nlogk)

可以使用实现了 堆 数据结构的集合。(TreeSet 或者 PriorityQueue)

具体流程:

  1. 比较器包含下述规则:
    1. 索引相等的覆盖掉。
    2. 索引不同且链表头部相同,就比较索引值。
    3. 否则比较链表的头部大小。
  2. 根据这个比较器创建一个优先队列,然后将所有的链表加入优先队列。
  3. 每次从优先队列内拿出一个最小结点,处理完成后将新的链表再次放入优先队列。
  4. 不断循环,直到优先队列内没有了链表。
  5. 最后返回 root.next 获得真实的头部结点 。

复杂度:O(nlogk) 的时间, O(n) 的空间

代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    class Couple {
        int index;
        ListNode e;
        Couple(int index, ListNode e) {
            this.index = index;
            this.e = e;
        }
    }
    
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<Couple> queue = new PriorityQueue<>(new Comparator<Couple>() {
            @Override
            public int compare(Couple o1, Couple o2) {
                if(o1.index == o2.index) return 0;
                
                if(o1.e.val == o2.e.val) {
                    return o1.index - o2.index;
                }

                return o1.e.val - o2.e.val;
            }
        }); 
        
        for(int i = 0; i < lists.length; i ++) {
            if(lists[i] != null) {
                queue.offer(new Couple(i, lists[i])); 
            }
        }
        
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        while(!queue.isEmpty()) {
            Couple node = queue.poll();
            cursor.next = node.e;
            cursor = cursor.next;
            if(node.e.next != null) {
                queue.offer(new Couple(node.index, node.e.next));
            }
        }
        
        return root.next;
    }
}
结果

在这里插入图片描述

解法四:分治解法 O(nlogk)

强力推荐,很精妙的分治,有点希尔排序的味道。

核心要点:

  1. step 的变化情况?
  2. 融合哪两个?
  3. i 的变化情况( i += 2 * step )?

具体流程:

  1. 第一次:对 lists 总链表两两融合,lists 有效链表个数变为总链表的 1/2
  2. 第二次:对 lists 的这 1/2 个有效链表两两融合,lists 有效链表个数变为总链表的 1/4
  3. 第三次:对 lists 的这 1/4 个有效链表两两融合,lists 有效链表个数变为总链表的 1/8
  4. … …
  5. 第logk次: lists只有一个有效链表,它融合了全部链表。
  6. 返回 lists[0] 即为新链表。

合并两个有序链表可以看我上篇博客:https://blog.youkuaiyun.com/LetJava/article/details/95902521

复杂度:O(nlogk) 的时间, O(1) 的空间

代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null || lists.length == 0) return null;
        
        int n = lists.length;
        for(int step = 1; step < n; step *= 2) {
            for(int i = 0; i + step < n; i += 2 * step) {
                lists[i] = mergeTwoLists(lists[i], lists[i + step]);
            }
        }
        
        return lists[0];
    }
    
    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode root = new ListNode(0);
        ListNode cursor = root;
        while(l1 != null && l2 != null) {
            if(l1.val < l2.val) {
                cursor.next = l1;
                cursor = l1;
                l1 = l1.next;
            } else {
                cursor.next = l2;
                cursor = l2;
                l2 = l2.next;
            }
        }
        
        if(l1 != null) cursor.next = l1;
        if(l2 != null) cursor.next = l2;
        
        return root.next;
    }
}
结果

在这里插入图片描述

OpenIddict实战指南:在.NET Core中构建安全的OAuth 2.0与OpenID Connect服务 本文详细介绍了如何在.NET Core中使用OpenIddict框架构建安全、标准的OAuth 2.0与OpenID Connect授权服务。内容涵盖从快速搭建授权服务器、理解核心配置与授权流程,到集成用户数据库、实现完整登录授权,以及生产环境下的安全加固与部署指南,为.NET开发者提供了一套现代、可维护的认证授权解决方案。 阅读详情

相关推荐

GPL vs MIT:独立开发者选择开源协议的法律与商业考量

你可能听过这样的故事:某个开发者用业余时间写了个超好用的工具库,开源后被某大厂悄悄集成到闭源产品里赚得盆满钵满,开发者却连杯奶茶钱都没拿到;也可能听说过另一个案例:开发者选了GPL协议,结果用户修改代码后必须开源,反而推动项目社区快速壮大,最终靠技术服务赚到了钱。这些故事的核心矛盾,都源于开源协议的选择。对于独立开发者(尤其是单枪匹马写代码的个人或小团队),开源协议不是“随便选一个就行”的小事——它是代码的“使用说明书”,更是保护自身权益、规划项目未来的关键工具。

AI天才研究院 1177

leetcode 合并k个排序列表(三种解法)

题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 解法1 建立一个数组,将所有元素保存,排序之后,再链接成一个链表 class Solution: def mergeKLists(self, lists): """ :type lists: List[ListNode] :rtype: ListNode ...

fanc的博客 1918

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

力扣 23. 合并k个有序链表

优先级队列的应用

weixin_73087898的博客 217

Docker新手必看:解决‘Unable to find image’错误的完整指南

本文针对Docker新手常见的‘Unable to find image’错误,提供了完整的排查与解决指南。文章深入剖析了权限不足、网络连接失败、Docker服务未运行等核心原因,并给出了将用户加入docker组、配置镜像加速器等实用解决方案,帮助读者彻底理解并解决镜像拉取问题。

weixin_29230901的博客 241

Smart200 PLC实现Bool信号接通延时、关闭延时作用

解决Smart200 PLC时间继电器和脉冲扫描P或N不能重复使用的问题,用于Bool信号延时接通和延时关闭的作用,可调整时间基数

gk_121的博客 4317

23. Merge k Sorted Lists等题 第二周解题报告

原题Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Life is short 977

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 892

Leetcode 23. 合并K个升序链表

用大小为k的堆来做,注意堆的使用。 23. 合并K个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4-&gt

AndyJ的学习放弃之旅 769

论文理解【LLM-Agent】——【SkillOpt】Executive Strategy for Self-Evolving Agent Skills

SkillOpt 将 agent skill 从人工或一次性 prompt artifact 转化为可验证、可控、可迁移的文本空间“可训练状态”,通过有界编辑、验证门控、拒绝编辑反馈和 slow/meta update,在不更新模型权重的情况下显著提升多类 agent 任务表现

佚失的诗篇 579

用 SAP HANA SDA 访问 PostgreSQL:从可行性到落地实践的完整指引

摘要:SAP HANA可通过SDA/SDI技术访问PostgreSQL数据库,支持数据虚拟化和实时复制。主要实现路径包括:1)使用Camel JDBC适配器创建虚拟表进行联邦查询;2)利用PostgreSQL Log Reader适配器实现变更数据捕获(CDC)。实施时需配置Data Provisioning Agent,注意权限和网络要求。官方文档指出,通过SDI+DP Agent的方式比直接SDA连接更稳定可靠。虚拟化查询时,HANA会自动将SQL下推到PostgreSQL执行,优化性能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 253

合并 K 个排序链表——Java解答

这个问题是一个典型的优先队列应用,它要求我们合并多个已排序的链表。这种类型的问题在处理多个排序数据流合并时非常有用,例如在外部排序和流处理中。给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

weixin_45594172的博客 620

web渗透--9--识别web应用框架

1、概述 Web框架指纹识别是信息收集过程中的一个重要任务。获悉目标框架的类型必然为测试人员带来极大的优势,如果该框架在之前就被测试过。测试人员不仅可以获得未修补版本中存在的漏洞,还可以了解此框架中特有的错误配置以及已知的文件结构。从而使指纹识别过程显得格外重要。

武天旭的博客 5097

Leetcode 23. 合并K个排序链表

Leetcode 23. 合并K个排序链表1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/   将链表两两合并即可。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "alg

珍惜 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【力扣LeetCode】23 合并K个排序链表

题目描述(难度难) 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 链接 https://leetcode-cn.com/problems/merge-k-sorted-lists...

Jiewang的博客 442

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java实现 LeetCode 23 合并K个排序链表

23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/m...

南 墙 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LeetCode 23 合并K个排序链表 Java

LeetCode 23 合并K个排序链表 Java题目描述代码 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 来源:力扣(LeetCode) 链接:https://le...

qq_29061435的博客 326

力扣LeetCode #23 合并K个排序链表(MergeKLists)

- 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 来源:LeetCode - 示例 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 - 思路分析 比较简单的想法是将k个链表的排序问题转换为1v1的问题,将前两个链表排序后,变成一个链表,再和第三个链表排序,又变成一个链表,以此类推。 - JAVA实现 public class Merg

weixin_49155948的博客 281

LeetCode 23:合并k个排序链表

LeetCode 23:合并k个排序链表题目描述解题思路代码实现总结 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 解题思路 借助堆的结构,将k个排序链表依次插入小顶堆...

香农三定律的博客 263

LeetCode 23 合并K个排序链表

LeetCode 23 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 解法一: 思路:先将所有链表的元素遍历一遍,将其数值添加入一个数组当中,在对...

sdm12345的博客 183

LeetCode:23. 合并K个排序链表(python)

LeetCode:23. 合并K个排序链表(python) 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 LeetCode 链接 思路: 分治法 合并两个有序链表(...

wk的博客 1431

LeetCode23 合并K个排序链表

题目 23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 class Solution { public: struct cmp { ...

weixin_43350346的博客 245

LeetCode 第 23 号问题:合并 K 个排序链表

本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。 个人网站:https://www.cxyxiaowu.com 题目来源于 LeetCode 上第 23 号问题:合并 K 个排序链表。题目难度为 Hard,目前通过率为 45.8% 。 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 ...

程序员吴师兄的博客 259

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

【力扣】23. 合并 K 个升序链表

学习笔记 992

leetcode 23. 合并K个排序链表

leetcode 23. 合并K个排序链表 题目详情 题目链接 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 我的代码 class Solution { public: ...

qq_33789406的博客 224

leetcode23. 合并K个排序链表

leetcode23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 多路合并类型。把链表里面的所有元素都扔在一个堆里面,最后取出来就是有序的。 pu...

peony的博客 129
上一篇: Leetcode 21. 合并两个有序链表
下一篇: Leetcode 24. 两两交换链表中的节点
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值