23. Merge k Sorted Lists 优先队列 比较器

把k个有序链表merge成一个有序的链表


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

使用优先队列,先把所有不为空的链表头放到优先队列中,然后将最大的一个poll()出来,如果这个最大的节点再原链表中有下一个节点那么把它的下一个节点放到优先队列中继续比较。

这样可以保证在当前为放到最终有序的大链表中的最大节点一定是在优先队列中、


注意优先队列的实现

比较器的实现

以及复杂度

里insert和deleteMin操作复杂度都是O(logk),k是lists.length

Time Complexity - O(nlogk), Space Complexity - O(k),  这里k为lists的长度,  n为所有的节点数


比较器的实现:1.2 return 1-2 就是由大到小排 return 2-1就是由小到大排

public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode dummy=new ListNode(-1);
        ListNode node=dummy;
        PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(new Comparator<ListNode>(){
            public int compare(ListNode l1,ListNode l2){
                return l1.val-l2.val;
            }
        });
        for(ListNode head:lists){
            if(head!=null){
                pq.offer(head);
            }
        }
        while(pq.size()>0){
            node.next=pq.poll();
            node=node.next;
            if(node.next!=null){
                pq.offer(node.next);
            }
        }
        return dummy.next;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值