LeetCode HOT 100 —— 23.合并K个升序链表

news2025/7/22 22:14:33

题目

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

请你将所有链表合并到一个升序链表中,返回合并后的链表。
在这里插入图片描述

思路

在做本题之前,先考虑一下,如何合并两个有序链表,见 21.合并两个有序链表

最直接的思路就是,用一个变量ans,来维护合并后的链表,第i次循环将第i个链表和ans合并,答案存到ans中,从而实现合并k个链表的功能

即相当于在 21.合并两个有序链表基础上加上一个for循环一次合并即可

java代码如下:

class Solution {
    public ListNode mergeKLists(ListNode[] list){
        ListNode ans = null;//初始化一个空节点,用来合并链表
        for(int i = 0; i < list.length; i++){
            ans = mergeTwoLists(ans,list[i]);
        }
        return ans;
    }

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);//创建虚拟头结点

        ListNode prev = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                prev.next = l1;
                l1 = l1.next;
            } else {
                prev.next = l2;
                l2 = l2.next;
            }
            prev = prev.next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,直接将链表末尾指向未合并完的链表即可
        prev.next = (l1 == null) ? l2 : l1;

        return dummy.next;//虚拟头结点的作用来了~
    }
}

但是这种合并可以进行优化,主要有两种优化思路:

思路一:分治合并

  • 将 k 个链表配对并将同一对中的链表合并;
  • 第一轮合并以后, k 个链表被合并成了 k / 2个链表,平均长度为 2n / k ,然后是 k / 4个链表, k / 8个链表等等;
  • 重复这一过程,直到得到了最终的有序链表。

java代码如下:

class Solution {
	//合并k个链表
	public ListNode mergeKLists(ListNode[] lists){
		return merge(lists, 0, lists.length - 1);
	}
	//分治合并
	public ListNode merge(ListNode[] lists, int l, int r){
        if (l == r) {
            return lists[l];
        }
		if( l > r ){
			return null;
		}
		int mid = l + (r - l) / 2 ;//防止溢出
		return mergeTwoLists(merge(lists, l , mid), merge(lists, mid + 1, r));//归并的核心
	}
	
	//这一段仍然是合并两个链表的代码,没有任何变化
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);//创建虚拟头结点

        ListNode prev = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                prev.next = l1;
                l1 = l1.next;
            } else {
                prev.next = l2;
                l2 = l2.next;
            }
            prev = prev.next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,直接将链表末尾指向未合并完的链表即可
        prev.next = (l1 == null) ? l2 : l1;

        return dummy.next;//虚拟头结点的作用来了~
    }
}

思路二:使用优先队列合并

优先队列:在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。

这里和前面的思路都不一样,用容量为K的优先队列(最小堆实现),把链表的头结点都放进去,然后出队当前优先队列中最小的,挂上链表,然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。(这里优先队列的优先级就是用链表的节点值来表示的)

java代码如下:

class Solution {
	public ListNode mergeKLists(ListNode[] lists){
		
		if(lists.length == 0){
			return null;
		}
		
		ListNode dummy = new ListNode(-1);//创建一个虚拟头结点,方便操作
		ListNode cur = dummy;//声明当前节点指向虚拟头结点
		PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {//自定义节点的排序方式,即按照节点大小的升序
			@Override
			public int compare(ListNode a, ListNode b){
				return a.val - b.val;//升序排列,b.val - a.val 就是降序
			}
		});
		
		for(ListNode list : lists){
			if(list == null){
				continue;//如果为空则跳过
			}
			pq.add(list);//不为空则加入优先队列
		}
		
		while(!pq.isEmpty()){
			ListNode node = pq.poll();//出队列最小的节点
			cur.next = node;//将该节点拼接到结果链表中
			cur = cur.next;
			if(node.next != null){//如果node下个节点不为空,则继续加入队列填补之前的空缺位置
				pq.add(node.next);
			}
		}
		return dummy.next;		
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊跨境:一年增长60%!人人都说跨境电商难做,但红利仍在(Starday)

随着经济全球化的发展&#xff0c;互联网的普及和跨境运输网络的日益发达&#xff0c;世界各国之间的贸易往来越来越频繁&#xff0c;跨境电商已然成为时代的主题。 近年来国家出口跨境电商利好政策的连续出台&#xff0c;加上《电商法》的保驾护航以及跨境电商从业者的积极推…

逻辑回归(logistic regression)

逻辑回归 一、假设函数 hθ(x)g(θTX)11e−θTX(Sigmoid函数)h_\theta(x) g(\theta^TX)\frac{1}{1e^{-\theta^TX}} \qquad \qquad \qquad (Sigmoid函数) hθ​(x)g(θTX)1e−θTX1​(Sigmoid函数) X取值范围是(−∞,∞)(-\infty, \infty)(−∞,∞) Y的取值范围是(0, 1) {θT…

基于FPGA的高速数据采集系统实现

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 2.1锁存器模块 2.2双口地址计数器模块 2.3双口RAM模块 2.4时钟分频模块 三、测试结果 一、理论基础 高速数据采集在军用民用领域都有着广泛的应用。高速数据采集系统在…

了解计算机里非门组成的部分

计算机中有一块硬件不是完全由NAND门构成的。这并不是把电脑变成电脑的必要条件&#xff0c;但大多数电脑都有一些。它们被用来从模拟的东西变成数字的东西&#xff0c;或者从数字变成模拟的东西。 人类的眼睛和耳朵会对类似的事物做出反应。我们听到的东西可以是响亮的&#x…

LeetCode 513找树左下角的值 112路径总和113路径总和ii 106从中序与后序遍历序列构造二叉树

文章目录513找树左下角的值c 代码实现python 代码实现112路径总和c 代码实现python 代码实现113路径总和iic代码实现python 代码实现106从中序与后序遍历序列构造二叉树c代码实现python 代码实现513找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 …

Java 基础(继承、接口、抽象)

面试题继承继承的特点super关键字继承中变量访问特点继承中构造访问特点为什么子类中所有构造方法默认都会访问父类无参构造方法。如果父类中没有无参构造继承中成员方法访问特点重写概述应用注意事项方法重写和重载有什么区别&#xff1f;静态代码块、构造代码块&#xff0c;构…

安泰测试-安捷伦N5182A射频矢量信号发生器

产品简介&#xff1a; 安捷伦N5182A信号源技术支持Agilent N5182A MXG 射频矢量信号发生器 N5182A主要特性与技术指标 信号表征 100 kHz &#xff5e; 3 或 6 GH 使用高度可靠、快速切换的电子衰减器&#xff0c;在 3 GHz 时 >23 dBm W-CDMA 动态范围&#xff1a;≤-73…

指纹浏览器功能对比:AdsPower VS Multilogin

近期&#xff0c;Conversion Club 发起了“最佳指纹浏览器”提名评选活动&#xff0c;AdsPower、Dolphin 和Multilogin 并列入选&#xff0c;成为国际认可的专业指纹浏览器。上期&#xff0c;龙哥出了一篇有关AdsPower与Dolphin 的对比文章&#xff0c;后台收到私信问能不能也出…

7位世界著名的制图师及其相关的地图介绍

制图是地图制作的艺术和科学&#xff0c;而作为制图师需要注意很多的细节&#xff0c;包括可视化数据以及地理的全面知识等。地图在每个人的生活中都发挥着一定的影响力&#xff0c;尤其是对于一些著名的制图师。本文将介绍7位世界著名的制图师及其相关的地图&#xff0c;让我们…

鸽群优化算法(Pigeon-inspired Optimization algorithm, PIO)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【优雅至极】利用VSCode进行远程Linux服务器、容器开发,达到ide开发项目的效果

本文将介绍“局域网下远程ide式开发”、“公网下远程ide式开发”、“局域网下远程容器的ide式开发”、“公网下远程容器的ide式开发”这四种开发流程&#xff0c;让你无论在工位上还是在家中&#xff0c;都可以像打开本地ide那样进行远程的项目开发。 0 本地ide式开发 最方便…

自然排序与比较器排序的使用

1、自然排序&#xff1a;java.lang.Comparable Comparable 接口中只提供了一个方法&#xff1a; compareTo(Object obj) &#xff0c;该方法的返回值是 int 。如果返回值为正数&#xff0c;则表示当前对象(调用该方法的对象)比 obj 对象“大”&#xff1b;反之“小”&#xff…

前端实现克里金插值分析(二)

作者:yangjunlin 在上一篇文章中我们已经使用了像素法实现克里金插值的方式&#xff0c;但是问题也就随之抛了出来。1.第一点&#xff0c;在反距离权重插值的时候&#xff0c;因为处理的数据量大会直接导致主线程卡&#xff0c;导致用户体验不好&#xff0c;2.第二点&#xff0…

Apache开启SSL(https)访问网站配置

前言:问题稍微有点绕,整个配置过程,测试成功 服务器的80端口分配了Apache使用了(用phpstudy运行php网站),服务器上还有(IIS网站,站点使用81端口),需要用80转81(中转代理一下到IIS访问网站,iis无需重复配置ssl设置) 就实现了:一台服务器使用2种语言(php/asp.ne…

闭环控制(自动控制理论)

目录 闭环控制 开环控制和闭环控制优缺点 闭环控制 即有被控制量反馈的控制。从系统中信号流向看&#xff0c;系统的输出信号沿反馈通道又回到系统的输入端&#xff0c;构成闭合通道&#xff0c;故称作为闭环控制系统&#xff0c;又或者称为反馈控制系统 这种控制方式&#xf…

微服务环境搭建SpringCloud入门

目录 案例准备 技术选型 模块设计 微服务调用 创建父工程 创建基础模块 创建用户微服务 创建商品微服务 创建订单微服务 我们本次是使用的电商项目中的商品、订单、用户为案例进行讲解。 案例准备 技术选型 maven&#xff1a;3.5.4 数据库&#xff1a;MySQL 5.7 持…

【矩阵论】4. 矩阵运算——广义逆——广义逆的计算

4.3.2 AA^A 计算 a. 秩1公式 若A(aij)mn,r(A)1,则A1∑∣aij∣2AH1tr(AHA)AH\begin{matrix} 若A(a_{ij})_{m\times n},r(A)1,则A^\frac{1}{\sum \vert a_{ij}\vert^2}A^H\frac{1}{tr(A^HA)}A^H \end{matrix} 若A(aij​)mn​,r(A)1,则A∑∣aij​∣21​AHtr(AHA)1​AH​ AHAA^HAA…

Qt Quick 用cmake怎么玩子项目

以往在公司开发众多的项目中&#xff0c;都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程&#xff0c;那么需要做到不会泄密。 举一下爪子&#xff0c;以前做雷达开发的时候&#xff0c;客户从公司那儿买了这些雷达模块&#xff0c;也会需要从…

信号量的使用

信号量 英文名字&#xff1a;semaphore 这里的进程信号量会为下列的信号量打基础 Ucos系统的信号量c线程的信号量java进程和线程的信号量 信号量作用 当多个进程/线程进行共享操作时&#xff0c;用于资源保护&#xff0c;以防止出现相互干扰的情况 信号量用于“资源的保护“ …

图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】

图论算法大合集一. dfs和bfs 过程中要有visited数组标记已遍历过的节点6-1.1 邻接矩阵存储图的深度优先遍历6-1.2 邻接表存储图的广度优先遍历二、欧拉回路&#xff08;度为偶数&#xff0c;且为连通图&#xff09;6-1.3 哥尼斯堡的“七桥问题”三、判断连通图6-1.4 地下迷宫探…