问题:

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

官方难度:

Hard

翻译:

合并k个已排序的链表,得到一个新的链表并且返回其第一个节点。分析并阐述其复杂度。

  1. 这是No.021(Merge Two Sorted Lists)的深入研究。
  2. 可以借鉴归并排序的思想,对于长度为k的数组,依次进行二路归并,返回这两个链表合并之后的头结点(利用No.021现成的代码),下次递归时,入参为长度为(k+1)/2的头结点数组。
  3. 在k为奇数时,先去掉最后一项,剩余项依次二路归并,再将最后一项放入新的数组。
  4. 由于使用递归,所以将递归方法独立出来,因为只要做依次入参检查即可。
  5. 算法的复杂度与归并排序相同,即O(nlogn)的时间复杂度,O(n)的空间复杂度。

解题代码:

  1. public static ListNode mergeKLists(ListNode[] lists) {
  2. if (lists == null) {
  3. throw new IllegalArgumentException("Input error");
  4. }
  5. if (lists.length == 0) {
  6. return null;
  7. }
  8. return mergeListsArray(lists);
  9. }
  10.  
  11. // 合并 k 个有序链表
  12. public static ListNode mergeListsArray(ListNode[] lists) {
  13. // 递归终点
  14. if (lists.length == 1) {
  15. return lists[0];
  16. }
  17. // 下一次递归的头结点数组
  18. ListNode[] next = new ListNode[(lists.length + 1) >>> 1];
  19. // 二路归并
  20. if (lists.length % 2 == 0) {
  21. for (int i = 0; i < lists.length; i += 2) {
  22. next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
  23. }
  24. } else {
  25. for (int i = 0; i < lists.length - 1; i += 2) {
  26. next[i >>> 1] = merge2Lists(lists[i], lists[i + 1]);
  27. }
  28. next[next.length - 1] = lists[lists.length - 1];
  29. }
  30. return mergeListsArray(next);
  31. }
  32.  
  33. // 合并2个有序链表
  34. private static ListNode merge2Lists(ListNode l1, ListNode l2) {
  35. if (l1 == null) {
  36. return l2;
  37. }
  38. if (l2 == null) {
  39. return l1;
  40. }
  41. // 返回的第一个节点
  42. ListNode first = l1.val > l2.val ? l2 : l1;
  43. // 上一个节点
  44. ListNode last = new ListNode(0);
  45. while (true) {
  46. if (l1.val > l2.val) {
  47. // 交换l1节点和l2节点,保证下一次循环仍然以l1节点为基准
  48. ListNode swapNode = l2;
  49. l2 = l1;
  50. l1 = swapNode;
  51. }
  52. // 将last节点的next指针指向l1,同时更新last
  53. last.next = l1;
  54. last = l1;
  55. // 带排序的链表遍历完成,剩余链表自然有序
  56. if (l1.next == null) {
  57. l1.next = l2;
  58. break;
  59. }
  60. l1 = l1.next;
  61. }
  62. return first;
  63. }

mergeKLists

相关链接:

https://leetcode.com/problems/merge-k-sorted-lists/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/hard/Q023.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

No.023:Merge k Sorted Lists的更多相关文章

  1. python 中的堆 (heapq 模块)应用:Merge K Sorted Lists

    堆是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短 ...

  2. LeetCode OJ:Merge k Sorted Lists(归并k个链表)

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

  3. LeetCode 023 Merge k Sorted Lists

    题目要求:Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and ...

  4. LeetCode之“链表”:Merge Two Sorted Lists && Merge k Sorted Lists

    1. Merge Two Sorted Lists 题目链接 题目要求:  Merge two sorted linked lists and return it as a new list. The ...

  5. [LeetCode] Merge k Sorted Lists 合并k个有序链表

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

  6. Merge k Sorted Lists

    1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...

  7. 71. Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  8. LeetCode——Merge k Sorted Lists

    Discription: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its ...

  9. 【Merge K Sorted Lists】cpp

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

随机推荐

  1. TODO:Linux安装PHP MongoDB驱动

    TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...

  2. iOS-数据持久化详细介绍

    1.iOS-数据解析XML解析的多种平台介绍 2.iOS-数据持久化基础-JSON与XML数据解析 3.iOS-数据持久化基础-沙盒机制 4.   数据持久化的几种方式: 1)plist(XML属性列 ...

  3. Content-Type List

    Content-Type List Description of Data Content Typical Filename Extensions MIME type/subtype       Te ...

  4. [C#] Socket 通讯,一个简单的聊天窗口小程序

    Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单 ...

  5. 无法启动WP Emulator

    记得以前Vware不能运行设置的东西了吗?http://www.cnblogs.com/dunitian/p/4480750.html 如果不清楚可以参考上面的链接 重启的时候选择第二项 重新打开就o ...

  6. 解密jQuery事件核心 - 委托设计(二)

    第一篇 http://www.cnblogs.com/aaronjs/p/3444874.html 从上章就能得出几个信息: 事件信息都存储在数据缓存中 对于没有特殊事件特有监听方法和普通事件都用ad ...

  7. Android之计算缓存大小并且清空缓存

    转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...

  8. Jquery通过Ajax方式来提交Form表单

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...

  9. ASP.NET 5 单元测试中使用依赖注入

    相关博文:<ASP.NET 5 使用 TestServer 进行单元测试> 在上一篇博文中,主要说的是,使用 TestServer 对 ASP.NET 5 WebApi 进行单元测试,依赖 ...

  10. 小菜学习设计模式(四)—原型(Prototype)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...