merge k sorted lists java_LeetCode 第23题 Merge k Sorted Lists【分而治之】【最小堆】(Java)...
这道题的题目是合并k个有序的链表,标定难度为Hard,详细需求:
合并k个有序的链表,返回一个新的有序链表。
例子:
Input:
1->4->5,
1->3->4,
2->6
Output: 1->1->2->3->4->4->5->6
逻辑不复杂,合并k个有序链表,我想不出来怎么一次性合并k个链表,貌似也不是不可以,但是代码感觉有点乱。但是更简单的方法就是反正我们刚做过21题,所以我们知道怎么合并两个有序链表。我们就一次合并两个有序链表,最后合并完全部的链表。这道题我们提供暴力解法、分而治之以及最小堆三种解法。
暴力解法
思路很简单一个for循环一个一个链表的去合并。总共需要合并k-1次。代码里面直接调用了21题的mergeTwoLists方法:
分而治之解法
分而治之怎么解这道题呢?其实大概一想就知道了,就是把问题分成两半,然后把子问题再分成两半,直到问题小到只剩两个链表,然后再返回一步一步合并结果。分析完了你会发现这个问题跟归并排序(Merge-Sort)的思路是一样的。所以,我们的解法就完全模仿了《算法导论》的归并排序的写法。那么复杂度也就是nlog(n).
最小堆解法
我们今天讨论了堆和堆排序算法。于是我给23题加入了一个用最小堆解决的方案。这里用的堆算法和《Leetcode专题 堆结构和堆排序》中提供的最大堆算法逻辑完全一样,只是最大换成最小而已。最大堆原理可以参看此文。
这段代码的思路是,首先把全部列表输入到数组里面,然后用数组构建一个最小堆,然后循环输出最小元素,串成一个链表输出。
你可以在Github代码里面看到包括最小堆实现的全部代码,这里只提供调用了我写的最小堆的代码的截图:
这道题是分而治之,如果你对分而治之算法本身不太熟悉,请参阅《算法导论》。《算法导论》一书在2.3.1章节介绍了Merge Sort(归并排序),在第4章“分而治之”介绍了4.1 the maximum-subarray problem(最大子数组问题),4.2 Strassen’s algorithm for matrix multiplication (Strassen的矩阵乘法算法)。
也请参阅我的文章《LeetCode专题 分而治之》,文章中实现了算法导论里面的这三个分而治之的问题的代码,以及LeetCode相关问题的一个列表。
也请参阅《Leetcode专题 堆结构和堆排序》,文章介绍了堆和堆排序,以及最大堆的实现。本题我们实现了一个最小堆,跟最大堆原理一样,只需要做几行修改即可。
打赏
微信扫一扫,打赏作者吧~
merge k sorted lists java_LeetCode 第23题 Merge k Sorted Lists【分而治之】【最小堆】(Java)...相关推荐
- [剑指offer][JAVA]面试题[第23题][合并K个排序链表][分治][优先队列]
[问题描述]23.合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [1->4->5,1->3->4,2->6 ] ...
- 最大堆、最小堆Java实现,解决TOP K问题
一.基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解. 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完 ...
- LeetCode 之 JavaScript 解答第23题 —— 合并K个有序链表(Merge K Sorted Lists)
Time:2019/4/10 Title: Merge K Sorted Lists Difficulty: Difficulty Author: 小鹿 题目:Merge K Sorted Lists ...
- 合并k个有序链表 python_leetcode第23题-合并K个有序链表
题目: 合并 k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例:输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1- ...
- Leetcode每日一题:23.merge-k-sorted-lists(合并K个排序链表)
这一题我的解也不好意思说出口,把所有值装入变长数组,排序,再转换成链表 复杂度应该在O(nlogn) 开销处于中流水平 评论中的 分治法(二分递归) 最小堆(C++优先队列实现) 着实没想到 stru ...
- Leetcode 23 合并k个升序链表 (每日一题 20210722)
给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...
- [leetcode-JavaScript]---23、合并K个排序链表
题目 合并 k 个排序链表,返回合并后的排序链表 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4-& ...
- BUCTOJ - 2023上半年ACM蓝桥杯每周训练题-1-A~K题C++Python双语版
文章目录 BUCTOJ - 2023上半年ACM&蓝桥杯每周训练题-1-A~K题C++Python双语版 前言 问题 A: 1.2 神奇兔子数列 题目描述 输入 输出 解题思路 AC代码 C+ ...
- HQChart实战教程23 - 点击K线显示历史分钟走势图
HQChart实战教程23 - 点击K线显示历史分钟走势图 需求 步骤 1. 注册K线点击监听事件 2. 点击监听函数 使用网路回调函数请求历史分钟 交流QQ群:950092318 HQChart代码 ...
最新文章
- 初学者如何搭建一个自己专属的电子实验室?
- Dribbble for windows phone 8
- 绝地求闪退be服务器未运行,绝地求生大逃杀BE启动失败,应用程序无法正常启动...
- 跨源资源共享(CORS)漏洞修复
- c# 弹性和瞬态故障处理库Polly
- java文件上传maven_ssm+maven框架搭建实现ajax多文件上传功能
- C++ 深拷贝和浅拷贝
- 详解CorelDRAW中如何合并与拆分对象
- JAVA判断素数法+引用方法
- Linux中缺32位运行库steam,Steam游戏必备运行库
- 大师级游戏建模教程:使用Maya和XGen进行角色制作
- Excel查询颜色RGB值
- Android开发 Studio4.0 APP logo 适配
- word、ppt文档比较
- 上海市房管局:物业公司信用将能手机查询
- 下一代广播电视音频解决方案:MPEG-H
- android 实现微信 语音信息 样式
- C语言实现原反补相互转换
- 大数据可视化大屏设计经验分享
- 基于51单片机交通灯控制系统
热门文章
- 配置PIX515E DMZ的基本方法与故障排除
- oracle定时任务(dbms_job)
- Spring发送带附件邮件
- echarts在.Net中使用实例(二) 使用ajax动态加载数据
- MyEclipse下Axis2插件的下载和安装
- 计算机编程术语. dsp,什么是数字信号处理器(DSP)
- 第四章 Lua模块开发
- PHP版本区别5与7:性能 64位 运算符 输入类型 返回类型 匿名类;7改进1.变量存储空间2.数组结构3.函数调用机制
- Linux日志查看head与tail配合查看区间行数的内容
- mysql 图形插件_对我来说数据库图形化管理工具用这个足够了