LeetCode 21. 合并两个有序链表(Python)

devtools/2025/3/4 8:35:18/

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

输入: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 均按 非递减顺序 排列

方法一:
使用哑结点(dummy node)和双指针来遍历两个链表,比较各自的节点值,将较小值的节点连接到新链表上,直至其中一个链表为空,最后将剩余部分直接接到新链表后面。

def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode:# 创建一个哑结点,方便返回结果链表dummy = ListNode(0)cur = dummy# 遍历两个链表,直到有一个为空while l1 and l2:if l1.val <= l2.val:cur.next = l1l1 = l1.nextelse:cur.next = l2l2 = l2.nextcur = cur.next# 将剩余部分接上cur.next = l1 if l1 else l2return dummy.next

代码解析
1. 初始化哑结点
创建一个哑结点 dummy 并用 cur 指向该节点,方便在不需要处理头节点特殊情况的同时构造新的链表
2. 双指针遍历
使用 while l1 and l2 循环遍历两个链表。比较 l1 与 l2 当前节点的值,将较小的节点接到新链表的尾部,并移动对应链表的指针。
3. 接上剩余部分
当其中一个链表遍历完毕后,另一个链表可能还有剩余节点,直接将剩余部分接到新链表末尾即可。
4. 返回结果:
最后返回 dummy.next,即合并后链表的头结点。

这种方法的时间复杂度为 O(n+m),空间复杂度为 O(1)(不考虑输出链表所需空间)。

方法二:
递归方法的核心思想是:比较两个链表的头节点,较小的那个作为合并后链表的头,然后递归合并剩下的部分。

# 定义链表节点类
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:# 如果有一个链表为空,直接返回另一个链表if not l1:return l2if not l2:return l1# 递归调用时通过 self 调用类内的方法if l1.val <= l2.val:l1.next = self.mergeTwoLists(l1.next, l2)return l1else:l2.next = self.mergeTwoLists(l1, l2.next)return l2

代码解析
1. 递归终止条件
如果 l1 为空,则直接返回 l2;如果 l2 为空,则返回 l1。这保证了当其中一个链表遍历完时,递归能正确结束。
2. 递归比较
对于非空的 l1 和 l2,比较它们的值:
• 如果 l1.val 小于等于 l2.val,则将 l1 作为当前节点,并将 l1.next 指向递归合并后的结果。
• 否则,将 l2 作为当前节点,并将 l2.next 指向递归合并后的结果。
3. 返回结果
递归完成后,每一层调用都会返回合并后的链表头,最终返回整个合并后的链表

这种方法同样能将两个升序链表合并为一个新的升序链表,时间复杂度为 O(n+m),但使用了递归来实现。


http://www.ppmy.cn/devtools/164412.html

相关文章

蓝桥备赛(六)- C/C++输入输出

一、OJ题目输入情况汇总 OJ&#xff08;online judge&#xff09; 接下来会有例题 &#xff0c; 根据一下题目 &#xff0c; 对这些情况进行分析 1.1 单组测试用例 单在 --> 程序运行一次 &#xff0c; 就处理一组 练习一&#xff1a;计算 (ab)/c 的值 B2009 计算 (ab)/c …

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器&#xff0c;支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发&#xff0c;拥有轻量级、高性能、易部署等特点&#xff0c;并且可以自由…

工程化与框架系列(6)--前端模块化工程详解

前端模块化工程详解 &#x1f9e9; 前端模块化是现代Web开发的核心理念之一&#xff0c;它帮助我们组织和管理日益复杂的前端代码。本文将详细探讨前端模块化工程的各个方面&#xff0c;从基础概念到实际应用。 模块化概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;模…

每日一题——接雨水

接雨水问题详解 问题描述 给定一个非负整数数组 height&#xff0c;表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_str_rbtree_insert_value

ngx_str_rbtree_insert_value 声明 在 src\core\ngx_string.h void ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp,ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); ngx_str_node_t *ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *name,uint32_t …

PostgreSQL的基本使用

参考视频&#xff1a;零基础入门PostgreSQL教程 文章目录 一、PostgreSQL是什么&#xff1f;二、基本使用1.下载2.操作 一、PostgreSQL是什么&#xff1f; PostgreSQL 是一个免费的对象-关系数据库服务器&#xff0c;在灵活的BSD许可证下发行。 二、基本使用 1.下载 2.操作 …

在 Ubuntu 下通过 Docker 部署 Mastodon 服务器

引言 大家好&#xff0c;我是Hitch。今天咱们来聊聊如何在 Ubuntu 系统上通过 Docker 部署 Mastodon 服务器。Mastodon 是一个开源的社交网络平台&#xff0c;像 Twitter 但更自由。Docker 是一个强大的容器化工具&#xff0c;可以让我们轻松地打包和部署应用。接下来&#xf…

在已有的原生 App 里嵌入 Flutter 页面的方法

在原生 App 中嵌入 Flutter 页面&#xff0c;通常使用 Flutter 提供的**平台通道&#xff08;Platform Channels&#xff09;**来实现原生代码与 Flutter 之间的交互。具体实现方式依赖于原生 App 的平台&#xff08;如 Android 或 iOS&#xff09;&#xff0c;下面是两种常见的…