[LeetCode]Merge K sorted List合并K个有序链表
来源:互联网 发布:javascript的回调 编辑:程序博客网 时间:2024/05/21 11:02
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Merge k Sorted Lists
回顾下算法课上学过的Heap, 维持一个min Heap, 时间复杂度是 O (log n), 原因是每次将添加到heap中的值和上面比较,如果比上面的小,就交换。
如果我们用merge sort的思路,也可以,以后把代码贴出来,先写这个。
思路:利用最小堆的性质,每次拿出来的都是最小的数,那么我们可以把lists中的那些链表的头head,全部放到堆中。这样就解决了我们的问题,因为虽然每个链表都排序好了,
但是你不知道各个链表中哪个数大哪个数小,堆的作用体现出来了。
有了堆,我们维持这个堆就好了:每次拿出最小的,然后在最小的点的那条链表中,把最小的节点(也就是链表的头)删去,把这条链表的第二个点当做头,放到堆中,然后堆又排了序。
为了持续移除,那我们就需要一个循环,就是当堆不为空的时候,做以上操作。当堆为了空,所有的元素也就都弄好了。
注意:因为ListNode是我们自己的类,heap的java实现是ProrityQueue,根据API文档得知,它是按自然顺序 ,我们需要用比较器排序,在建立对象时,构造方法中需要传递Compartor进去,实现也很简单.
代码如下
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode mergeKLists(List<ListNode> lists) { if(lists.size()==0) return null; PriorityQueue<ListNode> queue= new PriorityQueue<ListNode>(lists.size(),new MyComparator()); for(int i=0;i<lists.size();i++){ ListNode a=lists.get(i); if(a!=null){ queue.add(lists.get(i));} } ListNode mergedList=new ListNode(0); ListNode cur=mergedList; while(!queue.isEmpty()) { ListNode minheap=queue.poll(); ListNode next=minheap.next; cur.next=new ListNode(minheap.val); minheap.next=null; if(next!=null){ queue.offer(next); } cur=cur.next; } return mergedList.next; } public class MyComparator implements Comparator<ListNode> { public int compare(ListNode l1, ListNode l2){ return l1.val-l2.val; } }}
0 0
- [LeetCode]Merge K sorted List合并K个有序链表
- 合并k个有序链表 Merge k Sorted Lists
- Merge k Sorted Lists 合并k个有序链表@LeetCode
- LeetCode OJ 之 Merge k Sorted Lists(合并k个有序链表)
- 合并K个有序链表(LeetCode:Merge k Sorted Lists)
- Merge k Sorted Lists(合并k个有序链)
- leetcode解题之23.Merge k Sorted Lists Java版本(合并k个有序的链表)
- 【链表&合并K个有序链表】Merge k Sorted Lists
- 23. Merge k Sorted Lists 合并K个有序链表
- leetcode_效率题解_23. Merge k Sorted Lists(合并k个有序链表)
- Leetcode #23 Merge k Sorted Lists 合并K个有序列表 解题报告
- 24.leetcode Merge k Sorted Lists(hard)[归并k个有序链表]
- LeetCode 合并k个有序链表
- leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法
- LeetCode 23 Merge k Sorted Lists(合并K个已排序链表)
- Leetcode 23. Merge k Sorted Lists合并k个排序链表
- leetcode 23. Merge k Sorted Lists 合并k个排序链表 优先级队列
- LeetCode Merge k Sorted Lists(有序单链表数组的合并)
- 浅析人脸检测之Haar分类器方法
- [WebGL入门]十四,绘制多边形
- 向量的表示及协方差矩阵 (PCA的理论基础)
- 百度员工离职总结:如何做个好员工?(严重推荐)
- 一个关于IAP整理(部份)
- [LeetCode]Merge K sorted List合并K个有序链表
- 实现中等难度通讯录。需求: 1、定义联系人类AddressContact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人
- UVa11709 - Trust groups(Kosaraju,十字链表)
- 【BFS】uva10047The Monocycle
- python使用pygal进行绘制数据图表和监控图表
- HDU - 2222 Keywords Search (AC自动机)
- 三、进攻的敌人
- 对反射的理解
- 北京将严打电商售假:严重违法者将注销网站