LeetCode 23. 合并K个排序链表

题目

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:
	
	输入:
	[
	  1->4->5,
	  1->3->4,
	  2->6
	]
	输出: 1->1->2->3->4->4->5->6
	
	来源:力扣(LeetCode)
	链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
	著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

很简单,因为是小的先插入,使用优先队列实现。把k个链表当前第一个元素的集合视为查找范围,优先插入到链表
中,如果每次新对该集合加入一个元素,那么有需要重新把k个元素遍历一次,找出最小值。看到这里就想到了优先
队列节约时间。
暴力搜索的时间复杂度是O(N *K) ,优化后的时间复杂度为O(N*log K)

代码

class Solution {
   public static class compareNode implements Comparable<compareNode> {
		int value;
		ListNode to;
		public compareNode(ListNode node) {
			this.value = node.val;
			this.to = node;
		}

		@Override
		public int compareTo(compareNode o) {
			return this.value - o.value;

		}
	}

	public ListNode mergeKLists(ListNode[] lists) {
		// 每一个都是有序的
		int count = 0;

		ListNode head = new ListNode(-1);
		PriorityQueue<compareNode> pq = new PriorityQueue<compareNode>();
		for (int i = 0; i < lists.length; i++) {
            if(lists[i]!=null){
			pq.offer(new compareNode(lists[i]));}
		}
		ListNode last = head;
		while (!pq.isEmpty()) {
            compareNode tmp=pq.poll();
			ListNode minNode = tmp.to;
            
			last.next = minNode;
			if (minNode.next != null)
				pq.offer(new compareNode(minNode.next));
            last=last.next;
		}
		return head.next;
	}
}
上一篇:AcWing 903. 昂贵的聘礼 解题报告


下一篇:Problem D