合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
使用分治法,一直划分列表,直到一个单位格只剩下一个列表时,在两两合并。
public ListNode mergeKLists(ListNode[] lists) {
if (lists==null||lists.length==0)
return null;
return merge(lists,0,lists.length-1);
}
public ListNode merge(ListNode[] lists,int left,int right){
if(left==right)
return lists[left];
int mid=left+(right-left)/2;
ListNode LeftNode=merge(lists,left,mid);
ListNode rightNode=merge(lists,mid+1,right);
return mergeTwoList(LeftNode,rightNode);
}
//两个有序数组的合并
public ListNode mergeTwoList(ListNode left,ListNode right){
ListNode head=new ListNode();
ListNode node=head;
while(left!=null&&right!=null){
if(left.val<right.val){
head.next=left;
left=left.next;
}
else{
head.next=right;
right=right.next;
}
head=head.next;
}
if(left!=null)
head.next=left;
if(right!=null)
head.next=right;
return node.next;
}