LeetCode 算法:合并两个有序链表 c++

原题链接🔗:合并两个有序链表
难度:简单⭐️

题目

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

示例 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),它将作为合并后链表的前驱节点。使用哑节点的好处是可以直接返回哑节点的下一个节点作为合并后的链表的头节点。

  • 迭代合并:使用两个指针分别指向两个链表的当前节点,比较它们的值,将较小的节点连接到结果链表上,并将该节点的指针向前移动一位。

  • 处理剩余节点:当其中一个链表遍历完成后,将另一个链表剩余的部分直接连接到结果链表的末尾。

  • 返回结果:返回哑节点的下一个节点,即合并后链表的头节点。

  1. 复杂度:时间复杂度O(m+n),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的;空间复杂度O(1),只需要常数的空间存放若干变量。

  2. 过程:

  • 创建哑节点:ListNode* dummy = new ListNode(0);
  • 初始化尾指针:ListNode* tail = dummy;
  • 迭代比较:使用一个循环,当两个链表的当前节点都不为空时,进行以下操作:
    • 比较两个链表当前节点的值。
    • 将较小节点连接到tail的后面。
    • 移动tail和较小节点的指针。
  • 连接剩余节点:当其中一个链表的节点为空时,将另一个链表的剩余部分直接连接到tail后面。
  • 返回结果:返回dummy->next作为合并后链表的头节点。
  1. c++ demo
#include <iostream>struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {// 创建一个哑节点,作为合并后链表的起始点ListNode* dummy = new ListNode(0);ListNode* tail = dummy;// 用哑节点的 next 指针来逐步构建合并后的链表while (l1 != nullptr && l2 != nullptr) {if (l1->val < l2->val) {tail->next = l1;l1 = l1->next;}else {tail->next = l2;l2 = l2->next;}tail = tail->next;}// 将剩余的非空链表接在合并后的链表后面if (l1 != nullptr) {tail->next = l1;}else {tail->next = l2;}// 返回合并后的链表的头节点ListNode* result = dummy->next;delete dummy; // 释放哑节点return result;}
};int main() {// 测试代码ListNode* l1 = new ListNode(1);l1->next = new ListNode(2);l1->next->next = new ListNode(4);ListNode* l2 = new ListNode(1);l2->next = new ListNode(3);l2->next->next = new ListNode(4);Solution solution;ListNode* mergedList = solution.mergeTwoLists(l1, l2);// 打印合并后的链表while (mergedList != nullptr) {std::cout << mergedList->val << " ";ListNode* temp = mergedList;mergedList = mergedList->next;delete temp; // 释放节点}std::cout << std::endl;return 0;
}
  • 输出结果:

1 1 2 3 4 4
在这里插入图片描述

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

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

相关文章

AI智能盒子助力中钢天源设备工厂升级安全防护

中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司&#xff0c;主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中&#xff0c;采用并定制开发一系列厂区安全…

QT day02

思维导图 UI界面设计 设置登录界面&#xff0c;输入账号、密码&#xff0c;登录/取消 按钮 使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

【随想】今日收获

【1】在写项目代码时&#xff0c;能用const的地方就用const。理由有两个&#xff1a;①可读性高&#xff1a;对于其他开发人员&#xff0c;看到const修饰形参就知道该函数内部不会修改该形参。②安全性高&#xff1a;const能够避免某些属性被更改。③延长声明周期&#xff1a;c…

实体类的注解

Data 是 lombok 的注解&#xff0c;自动生成Getter&#xff0c;Setter&#xff0c;toString&#xff0c;构造函数等 Entity&#xff1a;必须项&#xff0c; 注解这是个实体类&#xff0c;数据库中创建的表名默认和类名一致 Table&#xff08;name“”,catalog“”,schema“”…

Python期末复习题库(上)

1. (单选题) Python源程序的扩展名为&#xff08; A &#xff09; A. py B. c C. class D. ph 2. (单选题) 下列&#xff08; A &#xff09;符合可用于注释Python代码。 A. # B. */ C. // D. $ 3. (单选题)下列关于Python 语言的特点的说法中&#xff0c;错误的是&#xf…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode&#xff1a; w方式打开文件&#xff1a;1、如果被打开文件不存在&#xff0c;系统会在使用fopen函…

6、while循环 - 习题解析

目录 解析部分&#xff1a;分支练习1244. 请问一个正整数能够整除几次2问题描述解题思路代码实现代码解析 1062. 求落地次数问题描述解题思路代码实现代码解析 1254. 求车速问题描述解题思路代码实现代码解析 1261. 韩信点兵问题描述解题思路代码实现代码解析 解析部分&#xf…

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变&#xff0c;平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…

汇编语言实验五、子程序和宏

1、编写子程序&#xff0c;传递一个字节无符号数组&#xff0c;返回最大值。要求用堆栈传递入口参数&#xff0c;返回值在al。 .MODEL SMALL,C .STACK 100H .DATA buf db 11h,33h,88h,55h,66h,44h,99h,22h,77h,01h buf_l equ lengthof buf buf_t equ type buf m db ? .CODE m…

零基础入门学用Arduino 第四部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试&#xff0c;支持生成html格式的测试报告&#xff0c;如下图所示&#xff0c;使用"npx playwright test"执行测试&#xff0c;执行完成后&#xff0c;会提示“npx playwright show-report”命令。执行该命令&#…

创维超充车辆交付仪式暨参观座谈会圆满举行

6月14日&#xff0c;创维超充车辆交付仪式暨参观座谈会在南京成功举行。苏舜集团副总经理程璟一行以及近多出行东部大区总经理张显春一行齐聚一堂。创维汽车总裁、联合创始人吴龙八等领导亲临现场&#xff0c;对各位尊贵嘉宾的到来表示热烈欢迎&#xff0c;并与众人共同见证了这…

RK3588/算能/Nvidia智能盒子:[AI智慧油站」,以安全为基,赋能精准经营

2021年9月&#xff0c;山东省应急管理厅印发了关于《全省危险化学品安全生产信息化建设与应用工作方案&#xff08;2021-2022 年&#xff09;》的通知&#xff0c;要求全省范围内加快推进危险化学品安全生产信息化、智能化建设与应用工作&#xff0c;建设完善全省危险化学品安全…

属于PCIe 7.0的那道光来了~

随着数据洪流的持续涌动与计算密集型应用的爆发式增长&#xff0c;传统的电子互连技术在应对高带宽、低延迟、节能等多维度需求时日益显现其局限性。在这个背景下&#xff0c;光学互连技术以其独特的性能优势&#xff0c;逐渐成为业界瞩目的焦点&#xff0c;被视为未来数据中心…

基于Umijs框架的人脸识别系统的服务端口号的更改方法

目录 一、问题描述 二、问题分析 1、umijs介绍 2、Umijs的端口配置 3、umijs的作用 4、尝试启动7000端口 5、再次查看配置文件 三、问题解决 1、更改package.json的start选项中的端口 2、结果验证 &#xff08;1&#xff09;项目启动日志查看 &#xff08;2&#x…

【正则表达式】入门

参考视频&#xff1a;10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果&#xff1a;regex101: build, test, and debug regex 示例&#xff1a; 限定符 ? 表示前一个字符可有可无 比如这里输入&#xff1a;de? 匹配结果可以得到d和de * 前…

【进阶篇-Day3:JAVA接口新特性、代码块、内部类、Lambda表达式、组件等的介绍】

目录 1、接口新特性1.1 JDK8的新特性1.2 JDK9的新特性 2、代码块2.1 代码块的定义2.2 代码块的分类 3、内部类3.1 内部类的定义3.2 内部类成员访问3.3 学习内部类的原因3.4 内部类的分类3.4.1 成员内部类3.4.2 静态内部类3.4.3 局部内部类3.4.4 匿名内部类&#xff08;1&#x…

优化 Flutter 应用开发:探索 ViewModel 的威力

介绍 1.1 什么是 ViewModel&#xff1f; ViewModel&#xff0c;顾名思义&#xff0c;就是视图的模型。在 Flutter 中&#xff0c;ViewModel 是一种用于管理视图状态和业务逻辑的重要概念。它承载了应用程序的核心功能&#xff0c;像是一个精心设计的控制中心&#xff0c;负责…

智能车联网安全发展形势、挑战

一、技术演进加速车联网安全环境复杂变化 当前&#xff0c;5G、大数据、大算力、大模型等技术正加速在车联网领域实现融合应用。车联网的网络通信能力、感知计算水平以及创新业务应用都在快速发展&#xff0c;与此同时&#xff0c;车联网的网络安全环境也在随之演进变化&#…

刷题——两个链表相加

原题&#xff1a;链表相加(二)_牛客题霸_牛客网 还没有完全掌握&#xff0c;只学会了反转链表 两个链表相加代码如下 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ class Solution { public:/*** 代码中的…