说明
算法:Merge k Sorted Lists
LeetCode地址:https://leetcode.com/problems/merge-k-sorted-lists/
题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
解题思路
题意是合并多个已排序的链表,分析并描述其复杂度,我们可以用分治法来两两合并他们,假设 k 为总链表个数,N 为总元素个数,那么其时间复杂度为 O(Nlogk)。
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) return null;
return helper(lists, 0, lists.length - 1);
}
private ListNode helper(ListNode[] lists, int left, int right) {
if (left >= right) return lists[left];
int mid = left + right >>> 1;
ListNode l0 = helper(lists, left, mid);
ListNode l1 = helper(lists, mid + 1, right);
return merge2Lists(l0, l1);
}
private ListNode merge2Lists(ListNode l0, ListNode l1) {
ListNode node = new ListNode(0), tmp = node;
while (l0 != null && l1 != null) {
if (l0.val <= l1.val) {
tmp.next = new ListNode(l0.val);
l0 = l0.next;
} else {
tmp.next = new ListNode(l1.val);
l1 = l1.next;
}
tmp = tmp.next;
}
tmp.next = l0 != null ? l0 : l1;
return node.next;
}
}
代码分析
那上面的例子来分析分而治之的思想:lists的length为3,
也就是求 helper(lists, 0, 2)/\
helper(lists, 0, 1) ------ helper(lists, 2, 2)
/\
helper(lists, 0, 0) — helper(lists, 1, 1)
所以 merge2Lists,先merge了 helper(lists, 0, 0) — helper(lists, 1, 1),
得到helper(lists, 0, 1),
merge2Lists 再merge了 helper(lists, 0, 1) ------ helper(lists, 2, 2),
得到最终的结果helper(lists, 0, 2)
代码执行效率
Runtime: 7 ms, faster than 90.19% of Java online submissions for Merge k Sorted Lists.
Memory Usage: 41.2 MB, less than 15.81% of Java online submissions for Merge k Sorted Lists.
总结
考查链表,分而治之思想。
代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/note/023/README.md