LeetCode 二十一:合并两个有序链表 【python】

简介: LeetCode 二十一:合并两个有序链表 【python】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

image.png

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

引言

在算法面试中,链表问题是非常常见且基础的题型之一。题目“合并两个有序链表”要求将两个升序链表合并为一个新的升序链表并返回。这个问题考察了对链表数据结构的理解和操作能力,同时也是动态规划、递归思想的应用实例。

题目描述

给你两个升序排列的整数链表list1和list2,请你将两个链表合并,返回一个新的升序链表。新链表是通过拼接给定的两个链表的所有节点组成的。

示例

输入:list1 = [1,2,4], list2 = [1,3,4] 
输出:[1,1,2,3,4,4]

说明:

  • 两个链表的节点数目范围是 [0, 50]。
  • -100 <= Node.val <= 100
  • list1 和 list2 均按 非递减顺序 排列

解题思路

方法一:迭代

迭代方法通过直观地比较两个链表的头节点,每次选取较小的节点添加到新链表的末尾,并移动指针,直至其中一个链表为空,最后将非空链表直接连接到新链表末尾。

代码示例

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
 
def mergeTwoLists(list1: ListNode, list2: ListNode) -> ListNode:
    dummy = ListNode(-1)
    prev = dummy
 
    while list1 and list2:
        if list1.val <= list2.val:
            prev.next = list1
            list1 = list1.next
        else:
            prev.next = list2
            list2 = list2.next
        prev = prev.next
 
    prev.next = list1 if list1 else list2
 
    return dummy.next

迭代法图解

使用指针prev遍历两个链表,每次选择较小的节点连接到prev,并移动指针,直至其中一个链表为空,然后将非空链表的剩余部分连接到合并链表的末尾。

初始化

  • dummy = Node(-1)作为新链表的哑节点。
  • prev = dummy作为当前节点的前一个节点。

迭代过程

  1. 比较list1和list2的头节点[1]和[2],将1连接到prev,移动list1。
  2. 比较[3]和[2],将2连接到prev,移动list2。
  3. 比较[3]和[4],将3连接到prev,移动list1。
  4. 比较[5]和[4],将4连接到prev,移动list2。
  5. 比较[5]和[6],将5连接到prev,移动list1。
  6. list1为空,将list2的剩余部分[6]连接到prev。

结果

通过迭代,最终得到的合并后的链表为[1, 2, 3, 4, 5, 6]。

方法二:递归

递归方法利用递归函数将问题分解为更小的子问题。如果list1的首元素小,那么它就应该是合并链表的首元素,其余元素由list1.next和list2合并得到;反之亦然。

代码示例

def mergeTwoLists(list1: ListNode, list2: ListNode) -> ListNode:
    if not list1:
        return list2
    elif not list2:
        return list1
    elif list1.val < list2.val:
        list1.next = mergeTwoLists(list1.next, list2)
        return list1
    else:
        list2.next = mergeTwoLists(list1, list2.next)
        return list2

递归算法图解

初始状态

  • list1 = [1, 3, 5]
  • list2 = [2, 4, 6]

我们要合并这两个列表。

递归过程

递归地比较list1和list2的头节点,选择较小的一个作为新链表的头节点,并对剩余的节点进行递归合并。

  1. 比较1和2,选择1,递归合并[3, 5]和[2, 4, 6]。
  2. 比较3和2,选择2,递归合并[3, 5]和[4, 6]。
  3. 比较3和4,选择3,递归合并[5]和[4, 6]。
  4. 比较5和4,选择4,递归合并[5]和[6]。
  5. 比较5和6,选择5,递归合并[]和[6]。
  6. list1为空,直接添加剩余的list2。

结果

合并后的链表为[1, 2, 3, 4, 5, 6]。

算法分析

时间复杂度:

  • 迭代法:O(n + m),其中n和m分别是两个链表的长度。
  • 递归法:O(n + m),递归的深度等于新链表的长度。

空间复杂度:

  • 迭代法:O(1),只使用了常数级别的额外空间。
  • 递归法:O(n + m),递归调用栈的空间。

结论

合并两个有序链表是一个基础且实用的算法问题,既可以用迭代法解决,也可以用递归法解决。这两种方法各有优缺点,迭代法更节省空间,而递归法代码更简洁。掌握这两种方法对于理解链表操作和递归思想非常有帮助。


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
541 2
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
372 6
Python 实现单向链表,和单向链表的反转
|
存储 Python
Python 中链表的个人理解
简介:本文介绍了Python中链表的基本组成及其操作实现。链表由`head`(头节点)、中间节点和`tail`(尾节点)三部分构成,每个节点通过`Node`类定义,包含`value`(值域)和`next`(指针域)。示例代码展示了链表的增删查功能,包括`add`(头部插入)、`append`(尾部插入)、`remove`(删除节点)、`search`(查找节点)及遍历方法。运行结果验证了链表操作的正确性。
|
存储 算法 搜索推荐
Python 实现反转、合并链表有啥用?
大家好,我是V哥。本文介绍Python实现反转链表和合并链表的应用场景及代码实现。反转链表适用于时间序列数据展示、回文链表判断等;合并链表则用于大规模数据排序、数据库查询结果集合并等。通过迭代和递归方法实现反转链表,以及合并两个或多个有序链表的算法,帮助开发者解决实际问题。关注V哥,了解更多实用编程技巧。 先赞再看后评论,腰缠万贯财进门。
337 0
|
Python
探索 Python 中链表的实现:从基础到高级
链表是一种由节点组成的基础数据结构,每个节点包含数据和指向下一个节点的引用。本文通过Python类实现单向链表,详细介绍了创建、插入、删除节点等操作,并提供示例代码帮助理解。链表在处理动态数据时具有高效性,适用于大量数据变动的场景。文章为初学者提供了全面的入门指南,助你掌握链表的核心概念与应用。
862 0
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
203 3
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
440 1
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
268 1
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
263 1
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
437 0
【Leetcode刷题Python】73. 矩阵置零

推荐镜像

更多