思路:
相当于多个合并2个升序链表的操作,将k个简化为2个
实际上就是利用分治法
合并2个升序链表可查看(https://blog.csdn.net/di_ko/article/details/115062966)
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists==null||lists.length==0) return null;
return merge(lists,0,lists.length-1);
}
private ListNode merge(ListNode[] lists,int low,int high){
if(low==high) return lists[low];
if(low>high) return null;
int mid=low+(high-low)/2;
return mergeTwoLists(merge(lists,low,mid),merge(lists,mid+1,high));
}
private ListNode mergeTwoLists(ListNode a, ListNode b) {
if(a==null||b==null){
return a==null?b:a;
}
//注意空链表的new形式
ListNode head=new ListNode(0);
ListNode tail=head;//是与head一致,而不是重新new一个
ListNode aPtr=a,bPtr=b;
//以下所有都是写aPtr或bPtr,而不是a或b
while(aPtr!=null&&bPtr!=null){
if(aPtr.val<bPtr.val){
tail.next=aPtr;
aPtr=aPtr.next;
}else{
tail.next=bPtr;
bPtr=bPtr.next;
}
tail=tail.next;
}
tail.next=aPtr==null?bPtr:aPtr;
//返回的是head.next,而不是head
return head.next;
}
}
分解:
处理利用分治法,还可以暴力,顺序合并2个链表
ListNode res=null;
for(int i=0;i<lists.length;i++){
res=mergeTwoLists(res,lists[i]);
}