力扣最热一百题——合并两个有序链表

news2024/9/21 4:39:42

目录

题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

题目描述

示例

提示:

解法一:比大小放入

Java写法:

运行时间以及复杂度

C++写法:

运行时间以及复杂度

总结


题目链接:21. 合并两个有序链表 - 力扣(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. 初始化哨兵节点
    • 创建一个哨兵节点(dummy node),其next指针指向null。这个哨兵节点将作为新链表的临时头部,这样做的好处是可以方便地在链表头部添加元素,而不需要特殊处理头节点为空的情况。
  2. 双指针迭代
    • 使用两个指针list1list2分别指向两个待合并链表的头部。
    • 遍历这两个链表,直到其中一个链表被完全遍历(即其指针为null)。
    • 在每次迭代中,比较list1list2当前指向的节点的值:
      • 如果list1的值较小或等于list2的值(由于题目中可能有重复元素,所以这里使用了小于等于),则将list1的当前节点连接到新链表的末尾(即哨兵节点的next指向的节点之后),并将list1的指针向后移动一位。
      • 否则,将list2的当前节点连接到新链表的末尾,并将list2的指针向后移动一位。
    • 同时,更新新链表的末尾指针(即current指针),使其指向新添加的节点。
  3. 处理剩余链表
    • 当其中一个链表被完全遍历后,如果另一个链表还有剩余节点(即其指针不为null),则将这个剩余链表直接连接到新链表的末尾。
    • 这是因为剩余的链表已经是有序的,所以可以直接添加而不需要进一步排序或比较。
  4. 返回合并后的链表
    • 遍历结束后,新链表的头部就是哨兵节点的next指针所指向的节点(因为哨兵节点只是为了方便操作而创建的,并不属于实际的合并结果)。
    • 所以,返回哨兵节点的next指针即可得到合并后的有序链表。

Java写法:

/**
 * 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 list1, ListNode list2) {  
        // 创建一个哨兵节点,方便处理头节点  
        ListNode sentinel = new ListNode(0);  
        ListNode current = sentinel;  
  
        while (list1 != null && list2 != null) {  
            if (list1.val < list2.val) {  
                current.next = list1;  
                list1 = list1.next;  
            } else {  
                current.next = list2;  
                list2 = list2.next;  
            }  
            current = current.next;  
        }  
  
        // 如果list1或list2还有剩余节点,直接连接到结果链表的末尾  
        if (list1 != null) {  
            current.next = list1;  
        }  
        if (list2 != null) {  
            current.next = list2;  
        }  
  
        // 返回哨兵节点的下一个节点,即合并后的链表头节点  
        return sentinel.next;  
    }  
}
运行时间以及复杂度

 

C++写法:

/**  
 * Definition for singly-linked list.  
 * struct ListNode {  
 *     int val;  
 *     ListNode *next;  
 *     ListNode() : val(0), next(nullptr) {}  
 *     ListNode(int x) : val(x), next(nullptr) {}  
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}  
 * };  
 */  
  
class Solution {  
public:  
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {  
        // 创建一个哨兵节点  
        ListNode* sentinel = new ListNode(0);  
        ListNode* current = sentinel;  
  
        // 使用双指针迭代合并两个链表  
        while (list1 != nullptr && list2 != nullptr) {  
            if (list1->val < list2->val) {  
                current->next = list1;  
                list1 = list1->next;  
            } else {  
                current->next = list2;  
                list2 = list2->next;  
            }  
            current = current->next;  
        }  
  
        // 处理剩余链表  
        if (list1 != nullptr) {  
            current->next = list1;  
        }  
        if (list2 != nullptr) {  
            current->next = list2;  
        }  
  
        // 返回合并后的链表头节点(哨兵节点的下一个节点)  
        ListNode* mergedHead = sentinel->next;  
        // 释放哨兵节点内存(可选,如果后续不再使用哨兵节点)  
        delete sentinel; // 注意:在实际应用中,可能需要保留哨兵节点以简化链表操作  
        // 但由于哨兵节点在函数返回后可能无法再被访问,因此通常不会在这里删除它  
        // 除非你确定合并后的链表将使用新的头节点进行管理,并且哨兵节点不再需要  
  
        // 由于通常哨兵节点是为了方便链表操作而引入的,并且会在函数外部进行管理,  
        // 因此这里我们不会删除哨兵节点,而是直接返回它指向的下一个节点作为合并后的链表头  
        return mergedHead;  
  
        // 注意:上面的delete sentinel;在实际情况下通常是不应该执行的,  
        // 因为哨兵节点是在函数内部创建的,并且其内存管理应该由调用者负责。  
        // 在这个例子中,我们直接返回了mergedHead,并没有删除哨兵节点。  
    }  
};  
  
// 注意:在实际使用中,通常不会删除哨兵节点,因为它只是作为一个辅助节点来帮助我们构建新链表。  
// 调用者应该负责管理哨兵节点(尽管在这个特定的例子中,哨兵节点并没有被直接返回给调用者)。  
// 但是,由于哨兵节点的`next`指针指向了合并后的链表头节点,我们可以安全地返回`mergedHead`而不用担心哨兵节点的内存泄漏。
运行时间以及复杂度

 


总结

说点注意事项吧。

  • 内存管理:在C++中,如果链表节点是动态分配的(如使用new关键字),则需要注意内存泄漏的问题。然而,在这个特定的例子中,我们并没有直接返回哨兵节点,而是返回了哨兵节点的下一个节点作为合并后的链表头。因此,哨兵节点的内存管理应由调用者负责,但在函数内部通常不会删除它,因为哨兵节点只是作为辅助节点使用。
  • 链表头节点:合并后的链表头节点是哨兵节点的下一个节点,它在新链表中是第一个真正的数据节点。
  • 链表遍历:在迭代过程中,我们实际上是在遍历两个链表,并通过比较来构建新的链表。当其中一个链表被完全遍历后,我们只需将另一个链表的剩余部分连接到新链表的末尾即可。
  • 链表结构:合并后的链表仍然保持升序排列,且其节点值来自原始的两个链表。

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

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

相关文章

Qt/C++事件过滤器与控件响应重写的使用、场景的不同

在Qt/C中&#xff0c;事件过滤器和控件响应重写是两种用于捕获和处理鼠标、键盘等事件的机制&#xff0c;它们的用途和使用场景不同&#xff0c;各有优劣。下面详细介绍它们的区别、各自适用的场景、以及混合使用的场景和注意事项。 1. 事件过滤器&#xff08;Event Filter&…

JavaScript 可选链操作符:深度解读与实战应用( JS 可选链操作符)

前言 在JavaScript开发中&#xff0c;我们经常会遇到访问嵌套对象属性的需求。然而&#xff0c;处理深层嵌套对象时&#xff0c;属性可能为 undefined 或 null&#xff0c;直接访问这些属性时会抛出错误。为了解决这种问题&#xff0c;JavaScript在ES2020中引入了一项新特性—…

104.游戏安全项目-基址的技术原理-基址的本质

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信…

【初阶数据结构】一文讲清楚 “堆” 和 “堆排序” -- 树和二叉树(二)(内含TOP-K问题)

文章目录 前言1. 堆1.1 堆的概念1.2 堆的分类 2. 堆的实现2.1 堆的结构体设置2.2 堆的初始化2.3 堆的销毁2.4 添加数据到堆2.4.1 "向上调整"算法 2.5 从堆中删除数据2.5.1 “向下调整”算法 2.6 堆的其它各种方法接口函数 3. 堆排序3.1 堆排序的代码实现 4. TOP-K问题…

主机和Docker容器之间的文件互传方法汇总

Docker渐渐成为前端的一个工具&#xff0c;它像一个通用包装&#xff0c;可以把各种环境包裹其中&#xff0c;从而实现跨设备的兼容。使用的过程中&#xff0c;往往会需要将本地的文件和docker容器内部的文件互传&#xff1a;将主机的文件传递给容器内&#xff0c;让里面的工具…

【LLM大模型】如何让大模型更好地进行场景落地?

自ChatGPT模型问世后&#xff0c;在全球范围内掀起了AI新浪潮。 有很多企业和高校也随之开源了一些效果优异的大模型&#xff0c;例如&#xff1a;Qwen系列模型、MiniCPM序列模型、Yi系列模型、ChatGLM系列模型、Llama系列模型、Baichuan系列模型、Deepseek系列模型、Moss模型…

sqli-lab靶场学习(二)——Less8-10(盲注、时间盲注)

Less8 第八关依然是先看一般状态 http://localhost/sqli-labs/Less-8/?id1 然后用单引号闭合&#xff1a; http://localhost/sqli-labs/Less-8/?id1 这关的问题在于报错是不显示&#xff0c;那没办法通过上篇文章的updatexml大法处理。对于这种情况&#xff0c;需要用“盲…

从 InnoDB 到 Memory:MySQL 存储引擎的多样性

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;MySQL学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; &#x1f680;前言 &#x1f525…

PSINS,GNSS速度与SINS滤波的MATLAB代码

文章目录 程序说明主要特点适用范围获取方式运行截图 程序说明 基于PSINS工具箱的GNSS和SINS滤波的MATLAB代码&#xff0c;观测量为GNSS的三轴速度。 专为工程师和研究人员设计&#xff0c;助您轻松实现高精度的导航和定位。 主要特点 高精度滤波算法&#xff1a;结合PSINS和…

内存dump文件分析

目录 dumpsneak攻击步骤&#xff1a; dump 打开Volatility工具目录&#xff0c;C:\Users\Administrator\Desktop\应急工具集\volatility 打开运行输入volatility.exe -f 文件 imageinfo&#xff08;花费比较长的时间&#xff0c;对于这个mem文件&#xff0c;可以使用Win2012…

【C++初阶】vector模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

什么是全国特价电影票api?接口如何对接?

一、全国特价电影票接口对接的基本情况 接口包含信息&#xff1a;电影票API接口中包含影院、影厅、座位、影片、场次、日期及票价等信息。市场需求背景&#xff1a;随着我国电影消费市场的火爆&#xff0c;观影人数增多&#xff0c;除了猫眼、淘票票等平台&#xff0c;各大平台…

SLA 概念和计算方法

SLA 概念和计算方法 SLA SLA&#xff1a;服务等级协议&#xff08;简称&#xff1a;SLA&#xff0c;全称&#xff1a;service level agreement&#xff09; 网站服务可用性的一个保证 9越多代表全年服务可用时间越长服务更可靠&#xff0c;停机时间越短&#xff0c;反之亦然…

简单题66-加一(Python)20240918

问题描述&#xff1a; python class Solution(object):def plusOne(self, digits):""":type digits: List[int]:rtype: List[int]"""n len(digits)# 从最后一位开始处理进位for i in range(n - 1, -1, -1):if digits[i] < 9:digits[i] 1re…

xmos 编程指南

并行执行 并行执行时使用par {} 进行并行处理 点灯 #include <stdio.h> #include<xs1.h> #include<timer.h> #include<platform.h>port p XS1_PORT_8C;void hw(unsigned n) { printf("Hello world from task number %u\n", n); } int ma…

多线程---线程的状态及常用方法

1. 线程的状态 在Java程序中&#xff0c;一个线程对象通过调用start()方法启动线程&#xff0c;并且在线程获取CPU时&#xff0c;自动执行run()方法。run()方法执行完毕&#xff0c;代表线程的生命周期结束。 在整个线程的生命周期中&#xff0c;线程的状态有以下六种&#xff…

文件翻译英文是什么软件?5款软件评测助你决策

在企业的日常运营中&#xff0c;文件翻译格式的多样性常常成为沟通效率的瓶颈。 从简单的文本文件到复杂的PDF文档&#xff0c;每一种格式都可能因为其特有的结构和布局&#xff0c;给翻译工作带来额外的挑战。 掌握翻译技巧需要时间和实践&#xff0c;以下是一些实用的翻译技…

数据增强又突破了!升级版“双杀”两大顶会,实现无痛涨点

数据收集和标注的艰难想必大家都有所体会&#xff0c;不仅耗时耗力还很贵&#xff0c;一般人顶不住。那怎么解决&#xff1f;你的“强”&#xff08;数据增强&#xff09;来了~ 数据增强作为一种正则化技术&#xff0c;可以帮助我们在有限的数据下&#xff0c;提高模型的性能。…

Vue.js魔法书:前端开发者的终极指南----指令篇续篇

​个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一个为了让更多人看见许舒雅的宝贝的小白先生 &#x1f921;个人主页&#xff1a;&#x1f517; 许舒雅的宝贝 &#x1f43c;座右铭&#xff1a;深夜两点半的夜灯依旧闪烁&#xff0c;凌晨四点的闹钟不止你一个。 &am…

linux 操作系统下的dhclient命令介绍和案例使用

linux 操作系统下的dhclient命令介绍和案例使用 dhclient 是 Linux 系统中用于动态主机配置协议&#xff08;DHCP&#xff09;客户端的命令。它的主要功能是从 DHCP 服务器获取网络配置&#xff0c;包括 IP 地址、子网掩码、默认网关和 DNS 服务器等信息 dhclient 命令概述 …