【算法】合并两个有序链表

目录

题目描述

思路分析

双指针法

递归法

Python代码

最后


题目描述

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

示例

1.

输入: L1 = 1,2,4, L2 = 1,3,4
输出:1,1,2,3,4,4

2.

输入: L1 = \[\], L2 = \[\]
输出:\[\]

3.

输入: L1 = \[\], L2 = 0
输出:0

思路分析

这道题用双指针法和递归法都可以

双指针法

即用两个指针同时遍历两个链表,比较两个指针所指节点的值大小,较小的节点的next指针指向较大的节点,然后移动指针继续比较

遍历直到其中一个指针为空为止,表示已经处理完了其中一个链表。这种方法用c/c++实现是很自然的,而对于Python用递归则更合适,下面详细介绍递归法

递归法

什么是递归呢?函数在运行时调用自己,这个函数就叫递归函数,调用的过程叫做递归

递归有两个规律:

  • 递归函数必须要有终止条件,否则会出错;
  • 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案

对于这道题:

终止条件 :当其中一个链表为空时,表示该链表已合并完成,return另一个链表(其实就是另一个链表剩下的直接拼接到尾部)
递归过程:判断 L1 和 L2 头节点哪个更小,然后较小结点的 next 指针指向其余节点的合并结果。(调用递归)

这里的递归过程这样理解:表面上来看是头节点连接上了后面已经合并过的有序链表(从上到下)

但程序运行实际是两个链表的尾节点先比较,大的放后面,这样的两个节点就组成了第一个最小的有序链表,然后return,上一层调用处接收到了这个有序链表,用同样的逻辑再进行比较(还是只比两个节点就行,因为后面已经有序了不用管),再return,最终得到整体的合并结果(从下到上)

还不理解的可以结合下面的代码进行理解

Python代码

python 复制代码
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if not list1: return list2
        if not list2: return list1
        if list1.val <= list2.val:
            list1.next = self.mergeTwoLists(list1.next, list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1, list2.next)
            return list2

这里两个if not是终止条件,val的比较表示主递归过程

最后

极致简洁的代码 是Python的魅力

相关推荐
Samooyou3 分钟前
大模型微调(Fine Tuning)
人工智能·python·ai·语言模型
qq_8573058195 分钟前
python语法
开发语言·python·算法
AI行业学习19 分钟前
CC-Switch v3.16.1 官方下载 | 安装配置详细教程【2026.6.10】
java·开发语言·vue.js·python·mysql·eclipse·html
DXM052123 分钟前
第9期|从机器学习到深度学习:AI遥感解译的进化逻辑
人工智能·算法·计算机视觉
小蒋学算法30 分钟前
算法-阶乘函数后K个零
算法
weixin_3077791337 分钟前
智能模拟数据生成平台:生成式AI合成数据技术重塑开发测试效能
人工智能·测试工具·算法·测试用例
Darling噜啦啦41 分钟前
JavaScript 数组深度解析:从纯函数到二维数组陷阱,一文吃透前端数据结构核心
前端·javascript·数据结构
早起CaiCai44 分钟前
【Pytorch 实践1】手写数字
人工智能·pytorch·python
吴梓穆1 小时前
Python 语法基础 函数
开发语言·python
Kobebryant-Manba1 小时前
学习文本处理
开发语言·python