Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
分析:
分治法,将k个链表合并问题转化为两个链表合并问题。
/**
* 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) {
//分治法,把K个链表变成两个链表合并的问题
if(lists==null || lists.size()==0)
return null;
return divide(lists, 0, lists.size()-1);
}
public ListNode divide(List<ListNode> lists, int start, int end){
if(start < end){
int mid = (start+end)/2;
return merge(divide(lists, start, mid), divide(lists, mid+1, end));
}
return lists.get(start);
}
//两路合并
public ListNode merge(ListNode l1, ListNode l2){
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
tail.next = l1;
l1 = l1.next;
}else{
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
if(l1 != null)
tail.next = l1;
else if(l2 != null)
tail.next = l2;
return dummy.next;
}
}