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

目录

题目描述

思路分析

双指针法

递归法

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

相关推荐
linx2958 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6058 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝8 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
砚底藏山河9 小时前
容错重试与指数退避:网络抖动手抖不再丢数据(魔码量化实战 #04)
java·数据库·python·金融
shehuiyuelaiyuehao9 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
今儿敲了吗9 小时前
02词云生成器
笔记·python
李高钢9 小时前
Python Tornado 框架入门:从零搭建你的第一个异步 Web 应用
前端·python·tornado
hanlin039 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang9 小时前
第02章 对话时间线与延迟分析
算法
科学实验家9 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法