码迷,mamicode.com
首页 > 编程语言 > 详细

Java for LeetCode 023 Merge k Sorted Lists

时间:2015-05-03 17:25:06      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

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

解题思路一:

之前我们有mergeTwoLists(ListNode l1, ListNode l2)方法,直接调用的话,需要k-1次调用,每次调用都需要产生一个ListNode[],空间开销很大。如果采用分治的思想,对相邻的两个ListNode进行mergeTwoLists,每次将规模减少一半,直到规模变为2为止,空间开销就会小很多。JAVA实现如下:

	static public ListNode mergeKLists(ListNode[] lists) {
		if (lists.length == 0)
			return null;
		if (lists.length == 1)
			return lists[0];
		if (lists.length == 2)
			return mergeTwoLists(lists[0], lists[1]);//参考Java for LeetCode 021 Merge Two Sorted Lists
		else {
			ListNode[] halfLists = new ListNode[lists.length / 2];
			if (lists.length % 2 == 0)
				for (int i = 0; i < halfLists.length; i++)
					halfLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
			else {
				for (int i = 0; i < halfLists.length; i++)
					halfLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
				halfLists[0] = mergeTwoLists(halfLists[0],lists[lists.length - 1]);
			}
			return mergeKLists(halfLists);
		}
	}

 解题思路二:

采用优先级队列,JAVA实现如下:

	public ListNode mergeKLists(ListNode[] lists) {
		Queue<ListNode> heap = new PriorityQueue<ListNode>(
				new Comparator<ListNode>() {
					public int compare(ListNode l1, ListNode l2) {
						return l1.val - l2.val;
					}
				});
		ListNode dummy = new ListNode(0), cur = dummy, tmp;
		for (ListNode list : lists)
			if (list != null)
				heap.offer(list);
		while (!heap.isEmpty()) {
			tmp = heap.poll();
			cur.next = tmp;
			cur = cur.next;
			if (tmp.next != null)
				heap.offer(tmp.next);
		}
		return dummy.next;
	}

 

Java for LeetCode 023 Merge k Sorted Lists

标签:

原文地址:http://www.cnblogs.com/tonyluis/p/4474240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!