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函数告诉优先队列怎么比较两个元素的大小,然后定义一个优先队列,就可以当成堆用了,真心方便啊。

最新文章

  1. unity小地图技术方案总结
  2. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上开发仪表盘控件
  3. 分析DH加密算法,一种适基于密钥一致协议的加密算法。
  4. B - I Hate It
  5. Python爬虫入门案例:获取百词斩已学单词列表
  6. 深入了解Java程序执行顺序
  7. BZOJ3226: [Sdoi2008]校门外的区间
  8. Myeclipse中把java代码导成UML类图
  9. Pure扩展站--个人博客
  10. wpf 动画 2个窗体切换
  11. head 命令
  12. 【前端JS】input textarea 默认文字,点击消失
  13. android开发SDcard 响应的文件相关处理(一)
  14. C# Socket SSL通讯笔记
  15. 14.MySQL(二)
  16. centos下mysql自动备份(亲测可用)
  17. Android Studio:xxx is not an enclosing class 错误的解决方法
  18. Objective-C编程 - 1. 浅谈内存分配
  19. 生产环境的gitlab大版本升级思路(从7.x升级到8.x)
  20. 2016-6-2-第二个sprint

热门文章

  1. 通过rinetd实现端口转发,同时访问阿里云RDS的内外网
  2. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的
  3. 转Postman请求Https接口
  4. 排序算法 C++代码实现
  5. Android开发之httpclient文件上传实现
  6. iWatch开发:UI 组件说明
  7. ApplicationContextRunner如何简化自动配置测试
  8. [译]GLUT教程 - 重整子窗体
  9. jenkins和gitlab版本
  10. 正负小数点后两位浮点数--jquery