合并K个排序链表

11 篇文章 0 订阅
2 篇文章 0 订阅

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

示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

来源:力扣(LeetCode)

法一:排序
法二:与归并排序的merge过程相似,依次选取每一个链表的最小值中的最小值直至链表为空。
法三:优先队列法。
思路源于法二,只不过一个好的数据结构能让我们做起事情来达到事半功倍的效果。

用到了PriorityQueue

 public ListNode mergeKLists(ListNode[] lists) {
		if(lists==null||lists.length==0) {return null;}
        PriorityQueue<ListNode> q = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
        	public int compare(ListNode c1,ListNode c2) {
        		if(c1.val == c2.val)return 0;
        		return c1.val>c2.val?1:-1;
        	}
        });
        ListNode l1 = new ListNode(0);
        ListNode p = l1;
        for(ListNode x:lists) {
            if(x!=null)
        	    q.add(x);
        }
        while(!q.isEmpty()) {
        	p.next = q.poll();
        	p = p.next;
        	if(p.next!=null) {
        		q.add(p.next);
        	}
        }
        return l1.next;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值