分治實現LeetCode 23題:合併K個排序鏈表

紀念第一道沒有看題解做出來的困難題

分治思想+歸併排序實現合併K個排序鏈表

由於是實現一連串已經排序的鏈表,所以第一時間想到了歸併排序

又由於是實現多個鏈表的總排序,爲了減少時間複雜度又想到了分治思想,這一題中也就是二分法

 

做了這麼多天的題總算有點進步

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
    	int len = lists.length;
    	
    	if(lists == null || len == 0) {
    		return null;
    	}
    	
    	//結果數組的頭結點
    	//ListNode res = new ListNode(0);
    	ListNode res = mergeKLists(lists, 0, len-1);
    	
    	return res;
    }

	private ListNode mergeKLists(ListNode[] lists, int left, int right) {
		if(left == right) {
			System.out.println("=");
			return lists[left];
		}
		
		int mid = left + (right - left)/2;
		ListNode leftList = mergeKLists(lists, left, mid);
		ListNode rightList = mergeKLists(lists, mid+1, right);
		
		return mergeSort(leftList, rightList);
		
	}

	private ListNode mergeSort(ListNode leftList, ListNode rightList) {
		ListNode temp = new ListNode(0);
		ListNode res = temp;
		while(leftList != null && rightList != null) {
			if(leftList.val <= rightList.val) {
				temp.next = leftList;
				leftList = leftList.next;
				temp = temp.next;
			} else {
				temp.next = rightList;
				rightList = rightList.next;
				temp = temp.next;
			}
		}
		
		if(leftList == null) temp.next = rightList;
		if(rightList == null) temp.next = leftList;
		
		System.out.println(res.next.val);
		return res.next;
		
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章