力扣第二十三题-合并K个升序链表

本文介绍力扣第23题的解决方案,通过优先队列合并多个已排序的链表。首先,获取所有链表的第一个节点,然后将最小节点加入新链表并更新队列。优先队列中存储的元素实现Comparable接口,确保每次取出的都是最小值。通过图解和代码实现详细阐述了整个过程。
摘要由CSDN通过智能技术生成

前言

力扣第二十三题 合并K个升序链表 如下所示:

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组为:[1->4->5,1->3->4, 2->6],将它们合并到一个有序链表中得到:1->1->2->3->4->4->5->6

示例 2

输入:lists = []
输出:[]

示例 3

输入:lists = [[]]
输出:[]

一、思路

这一题和之前的力扣 第二十一题-合并两个有序链表 基本是一致的,不过思路要稍作改变。

大体的步骤分为以下几个步骤:

  1. 拿到所有链表的第一个节点
  2. 比较各链表中的当前值,选取最小的值加入新链表,并将已加入链表的节点指向 next
  3. 重复步骤2

上面的实现步骤其实正好可以使用Java中的优先队列来实现,在实现过程中只需要关注何时向优先队列中加入元素和取元素即可。

优先队列中存储的是是一个基于优先处理的对象,即实现 Comparable 接口的类。
特别要注意的是,其实优先队列中实现 Comparable 接口是为了在插入元素时,将元素放到对应的位置,以保证第一个出来的是权值最小的(即 compareTo 返回的最小值)

图解优先队列

此处以示例1中的 [[1,4,5],[1,3,4],[2,6]] 作为例子
红色字:表示在优先队列中存储的值(以三个链表为例,队列中至多只会存储三个优先处理对象)
红色字后面的绿色字:表示它在优先队列中的存储位置
ret:结果集

初始情况,如下图所示

image.png

取出最小值1,并加入选择节点的后面一个节点4加入到优先队列。如下图所示:

image.png

继续取出最小值1,并加入选择节点的后面一个节点3加入到优先队列。如下图所示:

image.png

以此类推,结果集中会依次加入 2, 3,如下图所示:

image.png

后面再将 4, 4, 5, 6 加入到结果集即可得到最终结果 1->1->2->3->4->4->5->6

二、实现

代码实现

    class Status implements 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值