前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

作者头像
未名编程
发布于 2025-05-11 12:32:29
发布于 2025-05-11 12:32:29
5100
代码可运行
举报
文章被收录于专栏:PythonPython
运行总次数:0
代码可运行

在日常刷题和面试中,「合并两个有序数组」是一个经典基础题。虽然属于简单难度,但它非常考察你的数组操作技巧代码优化能力。本篇文章将带你从基础解法入手,进阶到最简洁的三元表达式写法,理解每一行代码背后的逻辑。

📌 题目描述

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn,分别表示这两个数组中有效的元素个数。 请你将 nums2 合并到 nums1 中,使合并后的数组仍然按 非递减顺序 排列。

约定:

  • nums1 的长度为 m + n,前 m 个元素是有效数据,后 n 个是 0(占位符,用于合并)。
  • nums2 的长度为 n,且所有数据都是有效的。

🧠 解题思路:三指针倒序归并

我们采用 倒序三指针法

  • 使用 i 指向 nums1 的有效部分末尾(即 m - 1);
  • 使用 j 指向 nums2 的末尾(即 n - 1);
  • 使用 k 指向 nums1 的最后(即 m + n - 1),准备从这里倒着填充最大值。

这样做的关键好处是:不需要移动 nums1 中已有的元素,从而提升效率,避免不必要的操作。


✅ 最简 Python 解法(含三元表达式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def merge(self, nums1: list[int], m: int, nums2: list[int], n: int) -> None:
        i, j, k = m - 1, n - 1, m + n - 1
        while i >= 0 and j >= 0:
            nums1[k], i, j = (nums1[i], i - 1, j) if nums1[i] > nums2[j] else (nums2[j], i, j - 1)
            k -= 1
        nums1[:j + 1] = nums2[:j + 1]

📖 逐行详解

初始化指针:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
i, j, k = m - 1, n - 1, m + n - 1
  • i 指向 nums1 的最后一个有效元素
  • j 指向 nums2 的最后一个元素
  • k 指向合并后数组的最后一个位置

主合并逻辑:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while i >= 0 and j >= 0:
    nums1[k], i, j = (nums1[i], i - 1, j) if nums1[i] > nums2[j] else (nums2[j], i, j - 1)
    k -= 1

这是代码的核心逻辑,用了一行三元表达式简洁完成以下步骤:

  • 比较 nums1[i]nums2[j],将较大的元素放入 nums1[k]
  • 更新对应指针(哪个元素被用掉,就移动那个指针)
  • k -= 1 每次填充后向前移动一位

❗ 注意:nums1[k], i, j = ...Python 中同时赋值的语法,它保证在一行中完成所有更新。


边界处理(复制剩余的 nums2):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nums1[:j + 1] = nums2[:j + 1]

为什么是 j + 1

  • Python 中切片是 左闭右开 的:[:j + 1] 表示从 0j(包含 j)的位置。
  • 如果 nums1 的元素全部更大,nums2 的部分没被填进去,那就直接复制剩下的部分到 nums1 的前面。

🔍 示例图解

示例输入:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
合并过程:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
初始:
i=2, j=2, k=5

比较 nums1[2]=3 和 nums2[2]=6 → 填入 nums1[5]=6,j--
比较 nums1[2]=3 和 nums2[1]=5 → 填入 nums1[4]=5,j--
比较 nums1[2]=3 和 nums2[0]=2 → 填入 nums1[3]=3,i--
比较 nums1[1]=2 和 nums2[0]=2 → 填入 nums1[2]=2,j--
比较 nums1[1]=2 和 nums2[-1]=越界 → 循环结束

最后复制剩余 nums2[:0+1] → nums2[0] → nums1[0]

最终输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[1, 2, 2, 3, 5, 6]

⏱️ 时间与空间复杂度

指标

说明

时间复杂度

O(m + n) — 每个元素最多处理一次

空间复杂度

O(1) — 原地合并,不用额外空间


🎯 总结

这题是数组类题目中的高频面试题:

  • 正确做法是从后往前合并,避免大量元素移动;
  • 代码可以用三元表达式写得更简洁优雅
  • 理解 [:j+1] 的切片语法是关键细节之一。

📌 推荐写法对比

写法

可读性

简洁性

面试推荐

标准 if/else 写法

✅ 高

❌ 稍长

✅ 推荐

三元表达式写法

❌ 稍低

✅ 极简

✅ 可选(加注释更好)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端算法专栏-数组-88.合并两个有序数组
很多朋友也是看着这套系列算法拿到很多offer!所以也是想分享给更多朋友,帮助到有需要的朋友。
程序员库里
2023/11/30
2501
【Leetcode-70.爬楼梯 -88.合并两个有序数组】
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 其中,1 <= n <= 45
YoungMLet
2024/03/01
1060
Leetcode No.88 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
week
2021/05/06
2010
LeetCode 88. 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
freesan44
2020/06/03
1700
(Leetcode 2021 刷题计划) 88. 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
windism
2021/04/05
2750
LeetCode-88. 合并两个有序数组(java)
进阶:你可以设计实现一个时间复杂度为 ​​O(m + n)​​ 的算法解决此问题吗?
bug菌
2023/05/27
3870
LeetCode-88. 合并两个有序数组(java)
88. 合并两个有序数组
给你两个按 「非递减顺序」 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
chuckQu
2022/08/19
5910
88. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
张伦聪zhangluncong
2022/10/26
6030
leetcode刷题(32)——88. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
老马的编程之旅
2022/06/22
1790
leetcode88.合并两个有序数组[easy](python)
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
从不摸鱼的van
2023/10/18
2660
LeetCode 图解 | 88. 合并两个有序数组
题目来源于 LeetCode 上第 88 号问题:合并两个有序数组。题目难度为 Easy。
五分钟学算法
2020/05/19
7730
LeetCode 图解 | 88.  合并两个有序数组
​LeetCode刷题实战88:合并两个有序数组
https://leetcode-cn.com/problems/merge-sorted-array/
程序员小猿
2021/01/19
3000
​LeetCode刷题实战88:合并两个有序数组
力扣刷题之合并两个有序数组
首先一种暴力的解法 我们可以直接将两个数组合并,然后直接排序 从数组的有效位的后边开始直接将num2的数组元素赋值去过,然后这样两者合并后在利用数据排序的方法一起排序。底层原理是一种快速排序。
兰舟千帆
2022/08/03
2360
力扣刷题之合并两个有序数组
LeetCode 88. 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
村雨遥
2020/04/29
3270
LeetCode 0088. 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
Yano_nankai
2021/02/24
3060
leetcode:合并两个有序数组
  给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
别团等shy哥发育
2023/02/25
1.8K0
leetcode:合并两个有序数组
【C语言刷题系列】合并两个有序数组
倔强的石头_
2024/12/06
1120
【C语言刷题系列】合并两个有序数组
【leetcode系列】88.合并两个有序数组
这道题目其实和基本排序算法中的 merge sort非常像,但是 merge sort 很多时候,合并的时候我们通常是 新建一个数组,这样就很简单。但是这道题目要求的是 原地修改.
lucifer210
2019/08/16
3740
每天一道leetcode88-合并两个有序数组
题目 每天一道leetcode88-合并两个有序数组 分类:链表 中文链接: https://leetcode-cn.com/problems/merge-sorted-array/ 英文链接 https://leetcode.com/problems/merge-sorted-array/ 题目详述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
乔戈里
2019/09/17
3870
☆打卡算法☆LeetCode 88、合并两个有序数组 算法解析
“给定两个递增数组和两个代表数组长度的整数,合并两个数组,返回合并后递增顺序的数组。”
恬静的小魔龙
2022/08/07
2290
☆打卡算法☆LeetCode 88、合并两个有序数组  算法解析
推荐阅读
相关推荐
前端算法专栏-数组-88.合并两个有序数组
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档