文章目录

  • 题目描述
  • 解法 & 代码
    • 二刷

冲的第一道hard,好耶!

题目描述

  • 这道题和前面的合并两个有序链表很有联系。直接调用了整个合并函数。
  • 可以看成我们已经有了足够优秀的“两条链表合并“的函数,然后考虑对K条链表如何进行合并分配。
  • 结构类似归并排序噢~

解法 & 代码

  • 对K条链表,用一个merge不断二分;当merge只有两条时,进行twoList合并操作。只有一条时,直接返回当前链表。(这也解决了在二分时出现奇数的问题
  • 之前考虑过不用merge,直接for循环一次合并入一条,也能过,但是复杂度会到O((m+n)*k)。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeKLists(ListNode[] lists) {// 数组空的情况,和数组为null的情况if(lists == null || lists.length == 0){return null;}return merge(lists, 0, lists.length - 1);}// 递归进行合并操作,复杂度log(n)public ListNode merge(ListNode[] lists, int left, int right){// 数组就一条链表的情况 && if (left == right)return lists[left];// 返回左、右两部分数组链表的两个结果,然后进行链表的两两合并twoList();return twoList(merge(lists,left, (right + left) / 2), merge(lists, (right + left) / 2 + 1, right));}// 放入两条链表,返回一条合并链表// 时间复杂度O(m+n)public ListNode twoList(ListNode l1, ListNode l2) {// 有链表为空的情况if(l1 == null)return l2;if(l2 == null)return l1;else if(l1.val < l2.val) {l1.next = twoList(l1.next,l2);return l1;}else {l2.next = twoList(l2.next,l1);return l2;}}
}
  • 时间复杂度O((m+n)*log(k)),也就是两链表合并的复杂度乘上K链表合并的复杂度
  • 空间复杂度O(1)

二刷

  • 这道题怎么样都是爆杀…hard友好题!
class Solution {public ListNode mergeKLists(ListNode[] lists) {if(lists == null || lists.length == 0) return null;return merge(lists, 0, lists.length - 1);}ListNode merge(ListNode[] lists, int left, int right) {if(left == right) return lists[left];if(left + 1 == right) return mergeTwoLists(lists[left], lists[right]);int mid = (left + right) / 2;return mergeTwoLists(merge(lists, left, mid), merge(lists, mid + 1, right));}ListNode mergeTwoLists(ListNode head1, ListNode head2) {if(head1 == null) return head2;if(head2 == null) return head1;if(head1.val < head2.val) {head1.next = mergeTwoLists(head1.next, head2);return head1;} else {head2.next =mergeTwoLists(head1, head2.next);return head2;}}
}

【LeetCode笔记】23.合并K个升序列表(Java、分治、链表)相关推荐

  1. 【LeetCode】【HOT】23. 合并K个升序链表(递归+分治)

    [LeetCode][HOT]23. 合并K个升序链表 文章目录 [LeetCode][HOT]23. 合并K个升序链表 package hot;import java.util.Arrays;cla ...

  2. [分治] leetcode 23 合并K个升序链表

    [分治] leetcode 23 合并K个升序链表 1.题目 题目链接 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例1: 输入:lists ...

  3. leetcode **23. 合并K个升序链表(2020.4.26)

    [题目]**23. 合并K个升序链表 21.合并两个有序链表 **23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [1->4-& ...

  4. LeetCode 23合并K个升序链表24两两交换链表中的节点

    维护不易,点赞再看,感谢支持 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1 ...

  5. 82. Leetcode 23. 合并K个升序链表 (排序)

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

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

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

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

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

  8. LeetCode题解-23 合并K个排序链表 Hard

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

  9. 小黑麦当劳坚韧leetcode之旅:23. 合并K个升序链表

    小黑答案 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): ...

最新文章

  1. YOLO发展史(v4/v5的创新点汇总!)
  2. python模拟手写笔迹_pytorch实现MNIST手写体识别
  3. jq之省市区级联插件
  4. C# Winform 窗体美化(七、Win7 Aero 毛玻璃效果)
  5. Kafka 源码解析:Server 端的运行过程
  6. Python练习-内置函数的应用
  7. 1.1 WEB API 在帮助文档页面进行测试
  8. python上下文管理器ContextLib及with语句
  9. C++11 关键字default和delete
  10. 哈尔滨工程大学第十四届程序设计竞赛(同步赛)
  11. 如何保存ISE综合后的RTL schematic为pdf
  12. 【UnityDragonBone】2D像纸娃娃系统所需资料
  13. android选择本地相册或拍照更换软件背景图片
  14. 《推荐系统》基于标签的用户推荐系统
  15. 笔记本电脑触摸板手势命令
  16. 软考--后缀式(逆波兰式)的两种求法
  17. pythonshell压缩文件_文件夹压缩成zip格式
  18. 发送邮箱验证码进行注册验证
  19. R6034 又来了.
  20. 使用键盘录入给选手打分

热门文章

  1. python选择某一行_Python常用语法有哪些 如何快速入门Python开发
  2. iis设置导致python调用urllib.request.urlopen出错问题
  3. python 通信模块_python 多进程通信模块
  4. java lookandfeel nimbus_动态改变LookAndFeel
  5. oracle rman和数据泵,使用RMAN或数据泵初始化OGG目标库
  6. 表格打印没有左边线_office办公软件Excel表格的打印技巧,建议收藏
  7. a12处理器和骁龙855_【性能】骁龙855最新跑分曝光 多核竟超苹果A12?
  8. C++模板函数只声明一种类型但输入两种类型参数
  9. python计算precision,recall,f1-score
  10. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换