https://leetcode.com/problems/merge-k-sorted-lists/
解题思路:
http://blog.csdn.net/linhuanmars/article/details/19899259
方法一:利用 Merge Two Sorted List 的归并思想,先将 k 个链表分成两半,再分别递归,最后归并两边的链表。归并排序是一个时间复杂度为 O(nlogn) 的算法。
solution 1 : Divide and Conquer
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
return helper(lists, 0, lists.length - 1);
}
public ListNode helper(ListNode[] lists, int low, int high) {
if (low < high) {
int mid = low + (high - low) / 2;
return merge(helper(lists, low, mid), helper(lists, mid + 1, high));
}
return lists[low];
}
public ListNode merge(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode prev = dummy;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
if(l1 != null) prev.next = l1;
if(l2 != null) prev.next = l2;
return dummy.next;
}
}
方法二:利用堆。
solution 2 : Heap(PriorityQueue)