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


题解:最开始用了最naive的方法,每次在k个链表头中找出最小的元素,插入到新链表中。结果果断TLE了。

分析一下,如果这样做,每取出一个节点,要遍历k个链表一次,假设k个链表一共有n个节点,那么就需要O(nk)的时间复杂度。

参考网上的代码,找到了用最小堆的方法。维护一个大小为k的最小堆,存放当前k个list中还没有放入最终链表的最前面一个元素,然后每次从堆顶摘取最小的元素放入答案列表中,然后从该元素所在链表中再取一个元素补充到最小堆中。如果这个链表没有元素了,就不往堆里面加新元素了。到堆空时,循环结束。

在这种方法中,建堆,摘取堆顶元素后无论是否插入新元素复杂度都是O(logk),所以n个元素总的时间复杂度就是O(nlogk)了。

代码如下:

 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
//implements interface listNodeComparator to tell the heap how to compare two elements
private Comparator<ListNode> listNodeComparator = new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
// TODO Auto-generated method stub
if(o1 == null)
return 1;
else if(o2 == null)
return -1; return o1.val-o2.val;
}
}; public ListNode mergeKLists(List<ListNode> lists) {
if(lists == null || lists.size() == 0)
return null; //Using a priority queue as heap
Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(),listNodeComparator); //add all head nodes of k lists into the heap
for(int i = 0;i < lists.size();i++)
if(lists.get(i) != null)
heap.add(lists.get(i)); ListNode answer = new ListNode(0);
ListNode kepler = answer; while(!heap.isEmpty()){
ListNode head = heap.poll();
kepler.next = head;
kepler = head; //if the list which we just extract elements from still has element,add it into the heap
if(head.next != null)
heap.add(head.next);
} return answer.next;
}
}

总结一下java实现heap的方法,实现一个 Comparator<ListNode> listNodeComparator 接口,在这个接口里主要实现compare函数告诉优先队列怎么比较两个元素的大小,然后定义一个优先队列,就可以当成堆用了,真心方便啊。

【leetcode刷题笔记】Merge k Sorted Lists的更多相关文章

  1. 刷题23. Merge k Sorted Lists

    一.题目说明 这个题目是23. Merge k Sorted Lists,归并k个有序列表生成一个列表.难度为Hard,实际上并不难,我一次提交就对了. 二.我的解答 就是k路归并,思路很简单,实现也 ...

  2. 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)

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

  3. LeetCode(23)Merge k Sorted Lists

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

  4. leetCode练题——21. Merge Two Sorted Lists(照搬大神做法)

    1.题目 21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new l ...

  5. 刷题21. Merge Two Sorted Lists

    一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...

  6. 【leetcode刷题笔记】Convert Sorted List to Binary Search Tree

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  7. 【leetcode刷题笔记】Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题解 ...

  8. 【LeetCode练习题】Merge k Sorted Lists

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

  9. [Leetcode][Python]23: Merge k Sorted Lists

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...

  10. 蜗牛慢慢爬 LeetCode 23. Merge k Sorted Lists [Difficulty: Hard]

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

随机推荐

  1. Android开发过程中遇到的问题集合(—)

    1. Re-installation failed due to different application signatures. 将原来的软件包删除掉,然后又一次安装一次就好了.在命令行上执行:a ...

  2. 教你如何把php项目打包成EXE文件发布

    家经常会接到一些编程的活,例如设计企业网站,做做财务,统计系统什么的.或许是因为朋友的需求,或许图个零花.不管什么原因吧.等程序做好了,给对方展示.安装,就成了问题.企业网站好说,至少需要个虚拟主机什 ...

  3. Andrew Ng机器学习笔记+Weka相关算法实现(五)SVM最优间隔和核方法

    这一章主要解说Ng的机器学习中SVM的兴许内容.主要包括最优间隔分类器求解.核方法. 最优间隔分类器的求解 利用以一篇讲过的的原始对偶问题求解的思路,我们能够将相似思路运用到SVM的求解上来. 详细的 ...

  4. STM32F4先设置寄存器还是先使能时钟

    http://zhidao.baidu.com/link?url=gdVNuIgLOJcV37QzbCx0IrFip5pskiPQDWpoZayr_xBEe120p4d_iWtrfDl1d4tSFaH ...

  5. eclipse 创建maven web错误Cannot change version of project facet Dynamic web module to 3.1解决方案

    Dynamic Web Module 选择“3.1”,java选择“1.8”,报错:Cannot change version of project facet Dynamic web module ...

  6. px值转rem值的Sublime Text 3自己主动完毕插件

    一个CSS的px值转rem值的Sublime Text 3自己主动完毕插件. 插件效果例如以下: 安装 克隆项目   https://github.com/hyb628/cssrem.git 进入pa ...

  7. Word 操作

    1.出文件,最后一页是附件.最后一页的页码不想要.如何删除?用的是 office word 2010版本,跟07 03版本界面不一样. 在最后一页的最前面插入分节符:下一页 ,编辑页脚.让页脚“取消链 ...

  8. 微信小程序事件

    微信小程序事件1.什么是事件2.事件类别3.事件冒泡4.事件绑定5.事件对象详解笔记:1.事件是一种用户的行为,是一种通讯方式.2.事件类别:    点击事件:tap    长按事件:longtap  ...

  9. Android自定义属性format类型

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...

  10. Linux Samba文件共享服务配置

    http://blog.csdn.net/xht555/article/details/4631063