用类似归并排序的方式来实现。
先把Lists折半分成两部分,分别对左右两部分递归调用原函数,得到两个ListNode后,按照mergeTwoLists的思路,将两个有序list合并成一个有序的list。
递归的终止条件有两个,如果Lists.size()=0,返回null,如果size==1,则返回list.get(0)。
mergeTwoLists的思路,与合并两个有序数组类似,也需要额外的空间。
必须要注意的是,要首先构造新的链表头节点,最终返回的是头节点。
public ListNode mergeKLists(ArrayList<ListNode> lists) {
int len = lists.size();
if(len==0){
return null;
}
if(len==1){
return lists.get(0);
}
int middle=len/2;
ArrayList<ListNode> left = new ArrayList<ListNode>();
for(int i=0;i<middle;i++){
left.add(lists.get(i));
}
ListNode leftList = mergeKLists(left);
ArrayList<ListNode> right = new ArrayList<ListNode>();
for(int i=middle;i<len;i++){
right.add(lists.get(i));
}
ListNode rightList = mergeKLists(right);
return mergeTwoLists(leftList,rightList);
}
ListNode mergeTwoLists(ListNode l1,ListNode l2){
ListNode head = null;
if(l1 == null)return l2;
else if(l2 == null)return l1;
else{
if(l1.val < l2.val){
head = new ListNode(l1.val);
l1 = l1.next;
}else{
head = new ListNode(l2.val);
l2 = l2.next;
}
}
ListNode l = head;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
l.next=new ListNode(l1.val);
l1=l1.next;
}else{
l.next=new ListNode(l2.val);
l2=l2.next;
}
l=l.next;
}
while(l1!=null){
l.next=new ListNode(l1.val);
l1=l1.next;
l=l.next;
}
while(l2!=null){
l.next=new ListNode(l2.val);
l2=l2.next;
l=l.next;
}
return head;
}
以上合并有序链表空间复杂度是O(N), mergeTwoLists有空间复杂度为O(1)的方法,可以参考一下。