23. k個の昇順リンクリストをマージする(難しい)

アイデア:

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

 

おすすめ

転載: blog.csdn.net/di_ko/article/details/115064660