合并K个排序链表
题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路分析
合并K个排序链表,可以先合并前K/2个的链表,再合并后K/2个的链表。同理类似的处理前K/2个的链表。由此可以通过递归实现。代码如下:
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0)return null;
if(lists.length==1)return lists[0];
if(lists.length==2)return mergeTwoLists(lists[0],lists[1]);
int mid=lists.length/2;
ListNode[] left=new ListNode[mid];
for(int i=0;i<mid;i++){
left[i]=lists[i];
}
ListNode[] right=new ListNode[lists.length-mid];
for(int i=mid;i<lists.length;i++){
right[i-mid]=lists[i];
}
return mergeTwoLists(mergeKLists(left),mergeKLists(right));
}
public ListNode mergeTwoLists(ListNode head1,ListNode head2){
if(head1==null)return head2;
if(head2==null)return head1;
ListNode head;
if(head1.val<head2.val){
head=head1;
head.next=mergeTwoLists(head1.next,head2);
}else{
head=head2;
head.next=mergeTwoLists(head1,head2.next);
}
return head;
}