合并多个有序链表(PriorityQueue)

问题:力扣23

【解题思路】:

使用java中的优先队列来解决这个问题,将数组中每个链表的头节点如下图所示,优先队列会自动排序,然后出队一个元素放入新地队列中,刚才出队的队列后移一位进入优先队列重新排序,重复这个过程,直到优先队列未空,所有元素都加入了新的队列中,合并结束! 

代码如下:

/**
 * 合并多个排好序的链表
 * 采用优先队列的方法
 */
class hb_LB {
    public ListNode mergeKLists(ListNode [] lists) {
        if (lists.length == 0) {
            return null;
        }
        int len = lists.length;
        ListNode p = new ListNode(-1);
        ListNode dump = p;

        //定义优先队列
        Queue<ListNode> pq = new PriorityQueue<>(len,(a,b)->(a.val-b.val));
        //将数组中每个队列的头节点都装入优先队列
        for(int i=0;i<len;i++){
            ListNode head = lists[i];
            pq.add(head);
        }
        //判断条件是队列不为空,当队列中所有元素出队之后也就都放到新的队列中了
        while (!pq.isEmpty()){
            //先出队最小的数
            ListNode cur = pq.poll();
            //放到新的队列中
            p.next = cur;
            //装入新的元素
            if(cur.next!=null){
                pq.add(cur.next);
            }
            //信队列后移
            p = p.next;
        }

        return dump.next;
    }
    public static void main(String [] args){
        ListNode[] lists = new ListNode[3];

        ListNode head1 = new ListNode(1);
        head1.addone(5);head1.addone(7);
        ListNode head2 = new ListNode(1);
        head2.addone(4);head2.addone(6);
        ListNode head3 = new ListNode(2);
        head3.addone(3);head3.addone(9);
        head1.printListnode();
        head2.printListnode();
        head3.printListnode();
        lists[0] = head1;
        lists[1] = head2;
        lists[2] = head3;
        hb_LB h = new hb_LB();
        ListNode newhead = h.mergeKLists(lists);
        newhead.printListnode();
    }
}

 顺便延伸一下优先队列的基本用法:

PriorityQueue这个类是Queue接口的直接子类,这个类叫做优先队列,首先队列本身这个数据结构大家应该都知道,在队列本身这个基础上又有了双端队列,优先队列,延迟队列等变形的数据结构,这类数据结构都为实际问题的解决中提供了更加便捷的方法,此类是一个线程非安全的类,线程安全的类是PriorityBlockingQueue。优先队列的用法在上面图中大家应该可以很好的理解了,下面我们介绍一些优先队列的方法构成。

1、构造函数

 我们最常用的构造方法是指定优先队列的大小并配置比较器。

 

2、其他方法

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智博的自留地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值