分治实现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;
		
	}

}

 

你可能感兴趣的:(java学习)