合并多个有序链表(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、其他方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
合并k个有序链表,可以使用分治法,将k个链表划分成两半,然后递归地合并左右两半,最后再将左右两半合并成一个有序链表。具体实现如下: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeKLists(lists: List[ListNode]) -> ListNode: if not lists: return None n = len(lists) if n == 1: return lists[0] left = mergeKLists(lists[:n//2]) right = mergeKLists(lists[n//2:]) return mergeTwoLists(left, right) def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode: dummy = ListNode(0) cur = dummy while l1 and l2: if l1.val < l2.val: cur.next = l1 l1 = l1.next else: cur.next = l2 l2 = l2.next cur = cur.next cur.next = l1 if l1 else l2 return dummy.next ``` 其中,mergeKLists函数接收一个由k个链表组成的列表,如果列表为空,则返回None;如果列表只有一个元素,则直接返回这个元素,表示已经合并完成;否则,将列表划分成左右两半,分别递归地调用mergeKLists函数,将左右两半合并成一个有序链表,最后返回这个有序链表。 mergeTwoLists函数用于合并两个有序链表,具体操作是,定义一个虚拟头节点dummy和一个游标cur,遍历两个链表,比较当前节点的值,将小的节点接到cur的next上,然后移动cur和对应链表的游标,直到其中一个链表为空,然后将另一个链表的剩余部分接到cur的next上,最后返回dummy.next即为合并后的有序链表
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智博的自留地

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

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

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

打赏作者

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

抵扣说明:

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

余额充值