Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题目分析:两个链表的链接会不会,归并排序,复杂度为O(N),N为节点数。
多个链表排序,两个两个归并,再归并,这样相当于做了logK层,每一层都为N,则复发度为o(NlogK),
public class MergeKSortedLists {
public ListNode mergeKLists(ListNode[] lists) {
int len=lists.length;
if(len==1) return lists[0];
if(len==0) return null;
/*把链表一分为二*/
ListNode[] list1=new ListNode[len/2];
ListNode[] list2=new ListNode[(len+1)/2];
for(int i=0;i<=len/2-1;i++)
{
list1[i]=lists[i];
}
for(int i=0;i<=(len+1)/2-1;i++)
{
list2[i]=lists[i+len/2];
}
/*递归归并*/
ListNode head1=mergeKLists(list1);
ListNode head2=mergeKLists(list2);
return mergeTwoLists(head1,head2);
}
public ListNode mergeTwoLists(ListNode one,ListNode two)
{
ListNode head=new ListNode(-1);
ListNode p=head;
while(one!=null&&two!=null)
{
if(one.val<=two.val)
{
p.next=one;
one=one.next;
}
else
{
p.next=two;
two=two.next;
}
p=p.next;
}
if(one!=null)
p.next=one;
else
p.next=two;
return head.next;
}
}