力扣刷题--21.合并两个有序链表

embedded/2024/11/23 7:29:42/

I am the best !!!

题目描述

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

示例 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. 初始化:

    • 如果 head1 为空,直接返回 head2

    • 如果 head2 为空,直接返回 head1

    • 创建两个指针 p1q1,分别指向 head1head2

    • 创建一个虚拟头节点 newhead,值为 0。这个虚拟头节点用于简化插入操作。

    • 创建一个尾指针 tail,初始时指向 newhead

  2. 合并链表

    • p1q1 都不为空时,进行比较和合并操作:
      • 如果 p1->val 小于 q1->val,将 p1 插入到 tail 的后面,然后更新 tailp1

      • 否则,将 q1 插入到 tail 的后面,然后更新 tailq1

    • 更新 p2q2 以记录 p1q1 的下一个节点。

    • 继续循环直到 p1q1 为空。

  3. 处理剩余部分:

    • 如果 p1 为空,说明 head1 已经全部合并,将 tail->next 指向剩余的 q1

    • 如果 q1 为空,说明 head2 已经全部合并,将 tail->next 指向剩余的 p1

  4. 返回结果:

    • 返回 newhead->next,这是合并后的链表实际头节点,跳过虚拟头节点。

复杂度分析:

  • 时间复杂度: O(m + n),其中 m 和 n 分别是两个链表的长度。在最坏情况下,我们需要遍历两个链表的所有节点。

  • 空间复杂度: O(1),只使用了常数级别的额外空间。

完整代码

class Solution {
public:ListNode* mergeTwoLists(ListNode* head1, ListNode* head2) {if(head1==NULL)return head2;if(head2==NULL)return head1;auto p1=head1;auto q1=head2;auto newhead=new ListNode(0);auto tail=newhead;//尾指针//p1,q1有一个为空,就结束while(p1!=NULL&&q1!=NULL){auto p2=p1->next;auto q2=q1->next;if(p1->val<q1->val){//头插,把p1插入到尾指针的后面p1->next=tail->next;tail->next=p1;//tail往后走tail=tail->next;//p1往后走p1=p2;}else{q1->next=tail->next;tail->next=q1;tail=tail->next;q1=q2;}}if(p1==NULL){tail->next=q1;}else{tail->next=p1;}return newhead->next;}
};

http://www.ppmy.cn/embedded/139803.html

相关文章

音频档案批量拷贝:专业SD拷贝机解决方案

批量音频档案拷贝最佳方案&#xff1a;解决播放错误与拷贝不完全问题 在现今数字化生产需求越来越高的时代&#xff0c;专业的拷贝机为大量数据复制提供了高效、安全的解决方案&#xff0c;特别是在批量拷贝音频档案至MicroSD卡并应用于播放器时&#xff0c;拷贝机具有无与伦比…

Python + 深度学习从 0 到 1(00 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 什么是深度学习&#xff1f; 人工智能、机器学习与…

【Python TensorFlow】进阶指南(续篇三)

在前几篇文章中&#xff0c;我们探讨了TensorFlow的高级功能&#xff0c;包括模型优化、分布式训练、模型解释等多个方面。本文将进一步深入探讨一些更具体和实用的主题&#xff0c;如模型持续优化的具体方法、异步训练的实际应用、在线学习的实现细节、模型服务化的最佳实践、…

利用图像识别给CAD图纸找不同

文章目录 论文地址一、背景及意义介绍背景介绍意义介绍 二、概述三、论文思路具体步骤 四、方法介绍基于图像处理的CAD图纸比对算法的方法介绍 五、复现过程&#xff08;1&#xff09;CAD图纸转换为PDF&#xff08;2&#xff09;图纸边缘切割对齐&#xff08;3&#xff09;高斯…

Docker 容器化开发 应用

Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结

【Android】android compat理解

1&#xff0c;前提 即便是在同一手机上安装的不同apk&#xff0c;其编译的apk不同&#xff0c;也会导致行为上的差异。如SDK34有限制后台启动&#xff0c;但如果安装的apk所依赖的sdk是33&#xff0c;则不会表现出此差异。这是如何实现的呢&#xff1f;其实&#xff0c;本质是…

视频美颜SDK开发详解:构建实时直播美颜平台的全流程

视频美颜SDK作为实现高质量实时美颜效果的关键工具&#xff0c;受到了广泛关注。本篇文章&#xff0c;小编将从技术架构、核心功能实现和开发流程等方面&#xff0c;详细解析如何构建一个实时直播美颜平台。 一、视频美颜SDK的核心架构 视频美颜SDK的架构设计通常围绕以下几个…

Rust derive macro(Rust #[derive])Rust派生宏

参考文章&#xff1a;附录 D&#xff1a;派生特征 trait 文章目录 Rust 中的派生宏 #[derive]基础使用示例&#xff1a;派生 Debug 派生其他常用特征示例&#xff1a;派生 Clone 和 Copy 派生宏的限制和自定义派生自定义派生宏上面代码运行时报错了&#xff0c;以下是解释 结论…