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

目录

题目描述

思路分析

双指针法

递归法

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的魅力

相关推荐
SelectDB3 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
BothSavage9 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn9 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽11 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
荣码11 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵1 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li1 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法