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

31/05/2017 今天又看了一下这个题,重温了一下PriorityQueue。 这题思路: 每次把PriorityQueue里最小的那个Node撸下来,然后把这个最小Node的next结点加入到PriorityQueue里去。PriorityQueue的意义在于能保证队首永远是最小的Node,后面的顺序每次add/offer都会变,无法保证是按顺序的(堆排序我还需要再复习一遍),但是我们也不需要后面是按顺序的,只需要min heap的堆顶元素就行了。


这题用了堆heap的思想,用的是优先权队列实现的。

   public ListNode mergeKLists(ListNode[] lists) {if (lists == null || lists.length == 0) return null;PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {@Overridepublic int compare(ListNode o1, ListNode o2) {//none - descending sortreturn o1.val - o2.val;}});for (ListNode list : lists) {if (list != null)queue.offer(list);}ListNode dummy = new ListNode(-1);ListNode tail = dummy;while (!queue.isEmpty()) {tail.next = queue.poll();tail = tail.next;//把每个链表上的node全撸下来加入到queue,注意这个撸下来的过程可能不是连续的,可能先撸了第一个链表的next就去撸下一个链表了if (tail.next != null) {queue.offer(tail.next);}}return dummy.next;}复制代码

一开始我不懂为什么这题的参数是一个数组,我以为应该是好几个参数,每个参数是一个list呢。直到看到

            if (tail.next != null) {queue.offer(tail.next);}
复制代码

我才恍然大悟,每个listNode自身就是一个链表呀。

引用CodeGanker的讲解:

维护一个大小为k的堆,每次取堆顶的最小元素放到结果中,然后读取该元素的下一个元素放入堆中,重新维护好。因为每个链表是有序的,每次又是去当前k个元素中最小的,所以当所有链表都读完时结束,这个时候所有元素按从小到大放在结果链表中。

其实我有点不太懂为什么这k个list要是已经排序好的了,因为这样看来根本不需要啊(我不懂Java的PriorityQueue是不是每次add/offer一个元素就会自动排序一次?如果是的话,那无论怎么插入元素,poll出来的永远是排好序的queue中的最小元素呀。。)

对于复杂度:这个算法每个元素要读取一次,即是k*n次,然后每次读取元素要把新元素插入堆中要logk的复杂度,所以总时间复杂度是O(nklogk)。空间复杂度是堆的大小,即为O(k)。

看来这里的offer/add用的是二分搜索形式。

转载于:https://juejin.im/post/5a3131446fb9a0450d111421

23 Merge k Sorted Lists相关推荐

  1. 21.Merge Two Sorted Lists 、23. Merge k Sorted Lists

    21.Merge Two Sorted Lists 初始化一个指针作为开头,然后返回这个指针的next class Solution { public:ListNode* mergeTwoLists( ...

  2. 合并k个有序链表 python_[LeetCode] 23. Merge k Sorted Lists 合并k个有序链表

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

  3. Python 解LeetCode:23. Merge k Sorted Lists

    题目描述:把k个排序的链表组成的列表合并成一个排序的链表 思路: 使用堆排序,遍历列表,把每个列表中链表的头指针的值和头指针本身作为一个元素放在堆中: 第一步中遍历完列表后,此时堆中最多会有n个元素, ...

  4. LeetCode 23. Merge k Sorted Lists

    解法一:Priority Queue 优先队列实际是对每次对list头结点依次比较排序的一种优化.插入和删除时间复杂度都为O(logk).一共n个数的话总共是O(nlogk). 复习一下优先队列的写法 ...

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

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

  6. 71. Merge k Sorted Lists

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

  7. LeetCode 23. Merge k Sorted Lists--Python解法--优先队列,分治法

    题目地址:Merge k Sorted Lists - LeetCode Merge k sorted linked lists and return it as one sorted list. A ...

  8. 【leetcode刷题笔记】Merge k Sorted Lists

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

  9. Merge k Sorted Lists leetcode java

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

最新文章

  1. 中国对计算机科学与技术人才的需求,计算机科学与技术整体概况之人才需求分析_跨考网...
  2. 计算机算法设计与分析一
  3. elasticsearch6.2.3 冷热架构设计
  4. 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照
  5. Arduino笔记-呼吸流水灯
  6. 分布式任务队列:Celery使用记录
  7. upc 7833 生日蛋糕
  8. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)
  9. Atitit 反模式 黑名单 异常处理 反模式(antipatterns) 目录 1.1. 记录并抛出(log and throw) 1 1.2. 抛出异常基类(Throwing Excepti
  10. Mac实用软件及功能总结
  11. Python爬虫技巧--selenium解除webdriver特征值
  12. 数学建模 之 ARCH模型和GARCH模型
  13. Foxmail 7.2数据迁移,导入旧数据
  14. 隐马尔模型----四
  15. 计算机体系结构 第七章 网络
  16. 我与校花同桌之间的金钱交易(又名:戏说值传递与引用传递,这还看不懂你来打我)
  17. docker 修改tomcat端口,部署ZrLog
  18. 解决MacOS系统升级时显示安装所选更新时发生错误的问题
  19. 如何合并pdf文件?
  20. LaTeX---行距设置

热门文章

  1. 分布式缓存DistributedCache的使用
  2. 1-5-20:球弹跳高度的计算
  3. Spring MVC 基础
  4. FTP资源下检测URL地址下文件大小
  5. linux0.11学习笔记-技术铺垫-简单AB任务切换程序(3)-调试手段和方法
  6. 《博客园精华集--Sharepoint分册》第三轮结果
  7. UVA11020 优势人群(multiset)
  8. hdu3706基础的单调队列
  9. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round J
  10. hdu4923 f(A,B)分段处理