这道题的题目是合并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)...相关推荐

  1. [剑指offer][JAVA]面试题[第23题][合并K个排序链表][分治][优先队列]

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

  2. 最大堆、最小堆Java实现,解决TOP K问题

    一.基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解. 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完 ...

  3. LeetCode 之 JavaScript 解答第23题 —— 合并K个有序链表(Merge K Sorted Lists)

    Time:2019/4/10 Title: Merge K Sorted Lists Difficulty: Difficulty Author: 小鹿 题目:Merge K Sorted Lists ...

  4. 合并k个有序链表 python_leetcode第23题-合并K个有序链表

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

  5. Leetcode每日一题:23.merge-k-sorted-lists(合并K个排序链表)

    这一题我的解也不好意思说出口,把所有值装入变长数组,排序,再转换成链表 复杂度应该在O(nlogn) 开销处于中流水平 评论中的 分治法(二分递归) 最小堆(C++优先队列实现) 着实没想到 stru ...

  6. Leetcode 23 合并k个升序链表 (每日一题 20210722)

    给你一个链表数组,每个链表都已经按升序排列.请你将所有链表合并到一个升序链表中,返回合并后的链表.示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3 ...

  7. [leetcode-JavaScript]---23、合并K个排序链表

    题目 合并 k 个排序链表,返回合并后的排序链表 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4-& ...

  8. BUCTOJ - 2023上半年ACM蓝桥杯每周训练题-1-A~K题C++Python双语版

    文章目录 BUCTOJ - 2023上半年ACM&蓝桥杯每周训练题-1-A~K题C++Python双语版 前言 问题 A: 1.2 神奇兔子数列 题目描述 输入 输出 解题思路 AC代码 C+ ...

  9. HQChart实战教程23 - 点击K线显示历史分钟走势图

    HQChart实战教程23 - 点击K线显示历史分钟走势图 需求 步骤 1. 注册K线点击监听事件 2. 点击监听函数 使用网路回调函数请求历史分钟 交流QQ群:950092318 HQChart代码 ...

最新文章

  1. 初学者如何搭建一个自己专属的电子实验室?
  2. Dribbble for windows phone 8
  3. 绝地求闪退be服务器未运行,绝地求生大逃杀BE启动失败,应用程序无法正常启动...
  4. 跨源资源共享(CORS)漏洞修复
  5. c# 弹性和瞬态故障处理库Polly
  6. java文件上传maven_ssm+maven框架搭建实现ajax多文件上传功能
  7. C++ 深拷贝和浅拷贝
  8. 详解CorelDRAW中如何合并与拆分对象
  9. JAVA判断素数法+引用方法
  10. Linux中缺32位运行库steam,Steam游戏必备运行库
  11. 大师级游戏建模教程:使用Maya和XGen进行角色制作
  12. Excel查询颜色RGB值
  13. Android开发 Studio4.0 APP logo 适配
  14. word、ppt文档比较
  15. 上海市房管局:物业公司信用将能手机查询
  16. 下一代广播电视音频解决方案:MPEG-H
  17. android 实现微信 语音信息 样式
  18. C语言实现原反补相互转换
  19. 大数据可视化大屏设计经验分享
  20. 基于51单片机交通灯控制系统

热门文章

  1. 配置PIX515E DMZ的基本方法与故障排除
  2. oracle定时任务(dbms_job)
  3. Spring发送带附件邮件
  4. echarts在.Net中使用实例(二) 使用ajax动态加载数据
  5. MyEclipse下Axis2插件的下载和安装
  6. 计算机编程术语. dsp,什么是数字信号处理器(DSP)
  7. 第四章 Lua模块开发
  8. PHP版本区别5与7:性能 64位 运算符 输入类型 返回类型 匿名类;7改进1.变量存储空间2.数组结构3.函数调用机制
  9. Linux日志查看head与tail配合查看区间行数的内容
  10. mysql 图形插件_对我来说数据库图形化管理工具用这个足够了