题目链接

思路

  • 最初的思路是上一题既然实现了归并两个链表,那么我们可以挨个归并~ 归并n-1次就可以,但是这样时间复杂度为O(k²n)
class Solution {public ListNode mergeKLists(ListNode[] lists) {if (0 == lists.length)return null;ListNode dummy = new ListNode(0, lists[0]);for (int i = 1; i < lists.length; i++) {ListNode head1 = dummy.next, head2 = lists[i], cur = dummy;while (null != head1 && null != head2) {if (head1.val < head2.val) {cur.next = head1;head1 = head1.next;} else {cur.next = head2;head2 = head2.next;}cur = cur.next;}cur.next = null == head1 ? head2 : head1;}return dummy.next;}
}
  • 上面的思路之所以算的慢是因为,设每个长度为k,共有n个,第一次归并遍历k+k次;第二次归并遍历2k+k次;第三次归并遍历3k+k次,因此总共时间复杂度为O(k²n²)
  • 但是我们可以第一次选择相邻两个归并,然后再相邻两个归并。也就是说,第一次是遍历n/2*(k+k) = nk次,第二次遍历n/4*(2k+2k)=nk次······因此时间复杂度为O(nklogn)
class Solution {private ListNode merge(ListNode head1, ListNode head2) {ListNode dummy = new ListNode(0), cur = dummy;while (null != head1 && null != head2) {if (head1.val < head2.val) {cur.next = head1;head1 = head1.next;} else {cur.next = head2;head2 = head2.next;}cur = cur.next;}cur.next = null == head1 ? head2 : head1;return dummy.next;}private ListNode mergeLists(ListNode[] lists, int start, int end) {if (start >= end)return lists[start];int mid = start + ((end - start) >> 1);ListNode head1 = mergeLists(lists, start, mid);ListNode head2 = mergeLists(lists, mid + 1, end);return merge(head1, head2);}public ListNode mergeKLists(ListNode[] lists) {if (0 == lists.length)return null;return mergeLists(lists,0,lists.length - 1);}
}

剑指offer 专项突破版 78、合并排序链表相关推荐

  1. LeetCode刷题 _「剑指 Offer]专项突破版

    第01天 整数 剑指 Offer II 001. 整数除法 class Solution:# 时间复杂度:O(logn), 空间复杂度:O(1)def divideCore(self, dividen ...

  2. 剑指Offer专项突破版(58)—— 日程表

    题目 剑指 Offer II 058. 日程表 思路 假设现在已经有一堆互不冲突的日程了,此时需要新增一个日程k,其开始时间为start,结束时间为end,怎么判断是否和已有的日程冲突呢? 先考虑所有 ...

  3. 剑指offer 专项突破版 74、合并区间

    题目链接 思路 注意合并区间的规则是,对于有重合的区间直接合并(重合意味着某一个区间的头部在另一个区间之中) 所以我们可以先把区间按照区间头排序,然后再挨个判断是否重合~ 注意具体的写法 class ...

  4. 剑指offer 专项突破版 73、狒狒吃香蕉

    题目链接 思路 这个也是范围内的查找,一开始可以确定狒狒的速度区间应该是[1,maxVal],但是有两个细节需要注意 如何通过piles数组和speed计算时间 result += (pile + s ...

  5. 剑指offer专项突破版

    面试题1:整除除法 力扣连接:https://leetcode-cn.com/problems/xoh6Oh/submissions/ 题目描述 输入两个int型整数,它们进行除法计算并返回商,要求不 ...

  6. 剑指offer 专项突破版 79、所有子集

    题目链接 思路一:回溯 对于这种可以分为若干步,每一步有很多选择的题目非常适合用回溯法来做. 具体的方式为写一个helper函数,参数为当前的结果集合subset,当前选择的数字的索引index. 首 ...

  7. 剑指offer专项突击版第24天

    剑指 Offer II 071. 按权重生成随机数 二分+前缀和 看了几遍题目愣是没看明白,最后看的题解明白了! 题意就是按照 w[i]w[i]w[i] 的权重选取下标 iii,这个问题可以转化成:所 ...

  8. 剑指 Offer II 022. 链表中环的入口节点(力扣剑指Offer专项突击版——链表2)

    题目 给定一个链表,返回链表开始入环的第一个节点. 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 po ...

  9. 剑指Offer Ⅱ 005.单词长度的最大乘积 (力扣剑指Offer专项突击版——整数_5)

    题目 给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值.假设字符串中只包含英语的小写字母.如果没有不包含相同字符的一 ...

最新文章

  1. java属于高级语言_以下哪种语言属于高级语言________________。A、JavaB、C++C、VisualBa...
  2. C#正则表达式整理备忘
  3. 高并发測试工具webbench
  4. 少儿编程线下培训水到渠成了吗?2018
  5. Python稳基修炼之计算机等级考试易错概念题5(含答案)
  6. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
  7. Alien Skin Exposure X6 mac汉化免费插件包胶片滤镜新功能介绍
  8. Porsche保时捷Taycan维修手册电路图接线图技术培训手册维修技术资料
  9. 视觉/视觉惯性SLAM最新综述:领域进展、方法分类与实验对比
  10. mysql cast numeric_(转载)mysql decimal、numeric数据类型
  11. 黑客技术入门|“知已知彼,百战不殆”——踩点
  12. 联想thinkpad E450C如何进入BIOS?
  13. 为什么国内APP热衷于皮肤特效
  14. php中$this-是什么意思?
  15. 城市规划数据—武汉市全部矢量+乡镇边界+POI数据
  16. 2020年11月14日
  17. 计算机如何设置u盘图标,如何将U盘的图标改成自己喜欢的图案,程序员:这段代码拿去试试...
  18. 【Web学习笔记】数据库连接池配置(DBCP)
  19. windows系统C#(.Net)MySql数据库同步工具
  20. 通信基础知识:单工,半双工,全双工

热门文章

  1. nyoj 144 小珂的烦恼
  2. matlab画图nan,在Matlab中过滤包含NaN的图像?
  3. vue 数组中不满足条件跳出循环
  4. Xiaojie雷达之路---TI实战笔记---ESM Driver说明
  5. android 打开其它app,Android 在一个APP里打开另一个APP
  6. 12.24魔术VS凯尔特人在线直播视频
  7. 1千用户与1千万用户的网站系统架构区别?
  8. oracle12c cc 功能,Oracle Database12c新特性:新增加的后台进程
  9. java计算身体质量指数
  10. Java编程工具有哪些比较实用