Leetcode:Merge k Sorted Lists
2014-11-18 15:52
92 查看
Merge k Sorted Lists:
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
思路是:首先将k个链表的第一个节点集合,建堆,然后取出堆顶的节点,链接到结果链表上,然后将该节点的下一个节点入堆,直到所有链表都已经完成。
这里用到了PriorityQueue,基于优先级堆的极大优先级队列。
实现代码:
关于PriorityQueue:
PriorityQueue是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。此队列的头是按指定排序方式的最小元素。如果多个元素都是最小值,则头是其中一个元素——选择方法是任意的。队列检索操作 poll、remove、peek 和 element 访问处于队列头的元素。
详细参考:http://blog.csdn.net/hudashi/article/details/6942789
关于Comparator:JAVA中的比较器,可以自己定义对象的比较方法。
Merge k sorted
linked lists and return it as one sorted list. Analyze and describe its complexity.
思路是:首先将k个链表的第一个节点集合,建堆,然后取出堆顶的节点,链接到结果链表上,然后将该节点的下一个节点入堆,直到所有链表都已经完成。
这里用到了PriorityQueue,基于优先级堆的极大优先级队列。
实现代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>() { public int compare(ListNode left, ListNode right) { if (left == null) { return 1; } else if (right == null) { return -1; } return left.val - right.val; } }; public ListNode mergeKLists(ArrayList<ListNode> lists) { if (lists == null || lists.size() == 0) { return null; } Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(), ListNodeComparator); for (int i = 0; i < lists.size(); i++) { if (lists.get(i) != null) { heap.add(lists.get(i)); } } ListNode dummy = new ListNode(0); ListNode tail = dummy; while (!heap.isEmpty()) { ListNode head = heap.poll(); tail.next = head; tail = head; if (head.next != null) { heap.add(head.next); } } return dummy.next; } }
关于PriorityQueue:
PriorityQueue是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。此队列的头是按指定排序方式的最小元素。如果多个元素都是最小值,则头是其中一个元素——选择方法是任意的。队列检索操作 poll、remove、peek 和 element 访问处于队列头的元素。
详细参考:http://blog.csdn.net/hudashi/article/details/6942789
关于Comparator:JAVA中的比较器,可以自己定义对象的比较方法。
相关文章推荐
- leetcode 21. Merge Two Sorted Lists
- LeetCode解题报告--Merge Two Sorted Lists
- [LeetCode] Merge k Sorted Lists
- Leetcode: Merge Two Sorted Lists
- [LeetCode][JavaScript]Merge k Sorted Lists
- LeetCode 21 - Merge Two Sorted Lists
- Leetcode 23 Merge k Sorted Lists
- 【LeetCode】21. Merge Two Sorted Lists
- 【leetcode】【单链表】【61】Merge k Sorted Lists
- Leetcode 21 Merge Two Sorted Lists 将两个已排序的链表合并起来
- leetcode笔记:Merge Two Sorted Lists
- Leetcode [Merge Two Sorted Lists]
- 个人记录-LeetCode 23. Merge k Sorted Lists
- leetcode做题总结,题目Merge Two Sorted Lists 2012/03/30
- leetcode 30: Merge Two Sorted Lists
- leetcode 23. Merge k Sorted Lists
- leetcode: (21) Merge Two Sorted Lists
- LEETCODE: Merge k Sorted Lists
- 【Leetcode】【python】Merge k Sorted Lists
- 【LeetCode】Merge Two Sorted Lists