LeetCode 23. 合并K个排序链表

   日期:2020-05-04     浏览:101    评论:0    
核心提示:题目合并 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;
	}
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服