アイデア:
これは、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]);
}