(Java)LeetCode-23. Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.


首先说明这道题我的代码运行时间可以排进前70%呀~开心~还是hard模式

这道题首先想到的是用k个指针分别指向每个List的头部,再其次遍历,不过这样每次都要求k个数里面的最小值,不好不好

然后思路是lists[0]和lists[1]先合并,再合并lists[2],依次到最后一个,这样时间复杂度是KM(M是总的节点个数,K是列表数)

最后我看到的Tags里有分治,于是就想到了归并排序,先排序左半部分,再排序后半部分,最后两个List合并,排左半部分的时候同样如此左右拆分,直到不能拆为止,和归并排序的想法一致。  采用归并排序的时间复杂度是MlogK,每层比较M个点,总共logK 层。代码如下~


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
	    if(lists.length == 0){
	        return null;
	    }
		ListNode res = merge(lists,0,lists.length-1);
		return res;	    
	}

	private ListNode merge(ListNode[] lists, int left, int right) {
		// TODO Auto-generated method stub
		if(right <= left){
			return lists[right];
		}
		
		int mid = left + (right - left)/2;
		ListNode Listleft = merge(lists,left,mid);
		ListNode Listright= merge(lists,mid+1,right);
		
		ListNode res = mergetwo(Listleft,Listright);
		
		
		return res;
	}

	private ListNode mergetwo(ListNode listleft, ListNode listright) {
		// TODO Auto-generated method stub
		ListNode head = new ListNode(-1);
		ListNode temp = head;
		while(listleft != null || listright != null){
			if(listleft == null){
				head.next = listright;
				return temp.next;
			}else if(listright == null){
				head.next = listleft;
				return temp.next;
			}else if(listleft.val >= listright.val){
				head.next = listright;
				head = head.next;
				listright = listright.next;
			}else{
				head.next = listleft;
				head = head.next;
				listleft = listleft.next;
			}
		}		
		return temp.next;
	}	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值