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

目录

题目描述

思路分析

双指针法

递归法

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

相关推荐
wj3055853788 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李8 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
qingfeng154159 小时前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
x_yeyue11 小时前
三角形数
笔记·算法·数论·组合数学
Mr. zhihao12 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
彦为君12 小时前
Agent 安全:从权限提示到沙箱隔离
python·ai·ai编程
念何架构之路12 小时前
Go语言加密算法
数据结构·算法·哈希算法