关闭

(Java)LeetCode-23. Merge k Sorted Lists

86人阅读 评论(0) 收藏 举报
分类:

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





0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14918次
    • 积分:1055
    • 等级:
    • 排名:千里之外
    • 原创:96篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论