Leetcode21:合并两个有效链表

news2024/11/7 2:10:08

原题地址:. - 力扣(LeetCode)

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

实现思路

  1. 输入检查:首先检查两个链表的头节点。如果一个链表为空,直接返回另一个链表的头节点。
  2. 优先队列(最小堆):使用一个优先队列来存储两个链表中的节点。通过重写比较器,确保队列中的节点按值升序排列。
  3. 遍历链表:将两个链表中的所有节点依次加入优先队列。在添加节点后,断开当前节点与后继节点的连接,以避免内存泄漏。
  4. 构建合并链表:从优先队列中依次取出节点,构建合并后的链表。使用一个临时节点指针来维护链表的尾部。
  5. 返回结果:返回合并后链表的头节点。

源码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 检查链表是否为空
        if (l1 == null) { return l2; } // 如果l1为空,返回l2
        if (l2 == null) { return l1; } // 如果l2为空,返回l1

        // 使用优先队列来存储链表节点
        PriorityQueue<ListNode> node = new PriorityQueue<>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.val - o2.val; // 按节点值升序排列
            }
        });

        // 遍历两个链表并将节点加入优先队列
        while (l1 != null || l2 != null) {
            if (l1 != null) {
                node.add(l1); // 添加l1节点
                ListNode next = l1.next; // 记录下一个节点
                l1.next = null; // 断开当前节点与后继的连接
                l1 = next; // 移动到下一个节点
            }
            if (l2 != null) {
                node.add(l2); // 添加l2节点
                ListNode next = l2.next; // 记录下一个节点
                l2.next = null; // 断开当前节点与后继的连接
                l2 = next; // 移动到下一个节点
            }
        }

        // 从优先队列中取出节点构建合并链表
        ListNode result = node.poll(); // 取出第一个节点作为合并链表的头
        ListNode temp = result; // 使用temp指针维护合并链表的尾部
        while (node.peek() != null) {
            ListNode tag = node.poll(); // 取出下一个节点
            temp.next = tag; // 将当前节点链接到合并链表的尾部
            temp = tag; // 更新temp指针
        }
        return result; // 返回合并后的链表头
    }
}

复杂度分析

  • 时间复杂度:O((m + n) log(m + n)),其中 m 和 n 分别是两个链表的长度。我们将所有节点加入优先队列的时间复杂度为 O(m + n),而每次从优先队列中取出节点的时间复杂度为 O(log(m + n)),因此总体复杂度为 O((m + n) log(m + n))。

  • 空间复杂度:O(m + n),我们在优先队列中存储了两个链表的所有节点,因此需要 O(m + n) 的空间。

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

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

相关文章

51c嵌入式~IO合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12383193 一、单片机通信数据接收解析方法 前阵子一朋友使用单片机与某外设进行通信时&#xff0c;外设返回的是一堆格式如下的数据&#xff1a; AA AA 04 80 02 00 02 7B AA AA 04 80 02 00 08 75 AA AA 04 80 02 00 9B E2…

java或c#是如何对数据库的表字段加密的处理的?

对于表格数据的加密处理&#xff0c;通常涉及到对数据库中存储的数据进行加密&#xff0c;以保护敏感信息。 Java示例&#xff08;使用AES算法加密数据库表数据&#xff09; 首先&#xff0c;你需要一个数据库连接&#xff0c;这里假设你使用的是JDBC连接MySQL数据库。以下是…

Android Studio Dolphin 下载、安装与配置教程

文章目录 Android Studio Dolphin简介一、核心特性二、新增功能三、用户体验优化 一&#xff0c;下载百度网盘迅雷云盘 二&#xff0c;安装三&#xff0c;下载组件四&#xff0c;添加SDK五&#xff0c;创建项目六&#xff0c;安装 Device模拟器运行项目 Android Studio Dolphin…

java开发等一些问题,持续更新

微服务和单服务的区别 微服务&#xff08;Microservices&#xff09;和单体服务&#xff08;Monolithic Architecture&#xff09;是两种不同的软件架构风格&#xff0c;各有其特点和适用场景。 微服务架构&#xff1a; 模块化&#xff1a; 微服务架构将应用程序分解为一系列小…

全国分省灵活就业情况数据集(2015-2019年)

数据简介&#xff1a;就业是民生之本&#xff0c;是“六稳”“六保”之首&#xff0c;对于拥有14亿人口的中国而言&#xff0c;就业问题至关重要。“十四五”规划建议中指出&#xff0c;应强化就业优先政策&#xff0c;千方百计稳定和扩大就业&#xff0c;实现更充分更高质量就…

杂货 | 每日资讯 | 2024.10.31

注意&#xff1a;以下内容皆为AI总结 在2024年10月30日&#xff0c;人工智能领域涌现出一些重要的新发展和大事件。这些新进展涉及人工智能在金融、搜索技术以及大型科技公司业务扩展中的广泛应用。本文将详细解读当天的几大AI事件&#xff0c;以便大家更好地理解当今AI技术的…

分享几款开源好用的图片在线编辑,适合做快速应用嵌入

图片生成器是指一种工具或软件&#xff0c;用于自动生成图片或图像内容&#xff0c;通常依据用户设定的参数或模板进行操作。这种工具能够帮助用户快速创建视觉效果丰富的图像&#xff0c;而无需具备专业的设计技能。 在数字化时代&#xff0c;图片编辑已经成为日常工作和生活的…

elasticsearch 8.x 插件安装(四)之简繁体插件

elasticsearch 8.x 插件安装&#xff08;四&#xff09;之简繁体插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后&#xff0c;把上表中的单位自动带入 那就要用到VLOOKUP函数&#xff0c;获取第2个表第1列的值后去第1个表的第1列匹配&#xff0c;匹配到后得到行数值&#xff0c;把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…

burp靶场-User ID controlled by request parameter with password disclosure

Lab: 由具有密码泄露功能的请求参数控制的用户 ID 实验描述&#xff1a; This lab has user account page that contains the current user’s existing password, prefilled in a masked input. 此实验室具有用户帐户页面&#xff0c;其中包含当前用户的现有密码&#xff0c;…

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式&#xff08;TextFile&#xff09; 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件&#xff08;ORCFile&#xff09; 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题&#xff0c;国家正在大力推进软硬件系统的信创替代&#xff0c;对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

工作流管理是什么?5款企业工作流管理工具推荐!

一、工作流管理 工作流管理是一个被业界广泛应用并迅速发展的技术。它主要是使处理过程自动化&#xff0c;使人以及各种应用工具相互之间协调工作&#xff0c;以完成某项工作。其目的是让合适的人或软件在恰当的时间执行正确的工作。通俗来说&#xff0c;工作流管理就是对业务…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

小新学习k8s第四天之发布管理

一、金丝雀发布&#xff08;灰度发布&#xff09; Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程&#xff0c;此时&#xff0c;仅存在一部分新版本的…

工业网络监控中的IP保护与软件授权革新

未来的智能工厂离不开稳定而高效的通信网络&#xff0c;这些网络在支撑生产流程的同时&#xff0c;也面临着复杂的管理与安全挑战。PROCENTEC推出了一系列硬件和软件产品&#xff0c;如Atlas、Mercury和Osiris&#xff0c;以提供全面的网络监控和故障排除能力。然而&#xff0c…

写在第六个“深圳企业家日”,看KPaaS如何助力企业数字化转型

每年的11月1日是“深圳企业家日”&#xff0c;这是深圳为表彰本地企业家精神而设立的纪念日。这一天&#xff0c;深圳的创业者和企业家们聚集一堂&#xff0c;总结过往&#xff0c;展望未来。企业家们在深圳的经济发展、技术创新和社会进步中扮演了重要角色&#xff0c;而这一天…

CVE-2024-51567 CyberPanel upgrademysqlstatus 远程命令执行

该漏洞源于upgrademysqlstatus接口未做身份验证和参数过滤&#xff0c;未授权的攻击者可以通过此接口执行任意命令获取服务器权限&#xff0c;从而造成数据泄露、服务器被接管等严重的后果。 影响版本 CyberPanel v2.3.5CyberPanel v2.3.6 目前官方已有可更新版本&#xff0…

【前端基础】HTML 基础

目标&#xff1a;掌握标签基本语法&#xff0c;能够独立布局文章页。 核心技术点 网页组成 排版标签 多媒体标签及属性 综合案例一 - 个人简介 综合案例二 - Vue 简介 02-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本&#xff1a;链接标记&a…

Es 基础操作 增删改查

ES想知道大家应该都很熟悉了&#xff0c;今天就来稍微介绍入门下 也是为了帮助自己记忆 一. ES专属名称 看上面图就知道了 具体分片副本的就不讲那么细了 还有个倒排索引可以了解下 相当于把内容拆分成分词 然后每个分词都对应哪些内容对应的id 这样查到了分词就能查到哪些…