(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;
	}	
}





阅读更多
个人分类: JAVA LeetCode
上一篇(Java)LeetCode-22. Generate Parentheses
下一篇(Java)LeetCode-24. Swap Nodes in Pairs
想对作者说点什么? 我来说一句

Merge two lists of ordered numbers

2012年12月13日 1KB 下载

Redis 编译安装手册详解

2015年09月02日 415KB 下载

k线图绘制的java程序

2012年01月03日 9KB 下载

java k线画图源代码

2008年09月13日 16KB 下载

Araxis Merge对比工具

2017年07月17日 22.78MB 下载

Araxis Merge v6.5(含破解补丁)

2012年07月28日 22.93MB 下载

Redis、C#、缓存、分布式Demo

2017年11月02日 1.9MB 下载

没有更多推荐了,返回首页

关闭
关闭