当前位置: 首页 > java >正文

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

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


📌 题目描述

给你两个按 非递减顺序 排列的整数数组 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 解法(含三元表达式)

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 - 1while 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 -= 1nums1[:j + 1] = nums2[:j + 1]

📖 逐行详解

初始化指针:

i, j, k = m - 1, n - 1, m + n - 1
  • i 指向 nums1 的最后一个有效元素
  • j 指向 nums2 的最后一个元素
  • k 指向合并后数组的最后一个位置

主合并逻辑:

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):

nums1[:j + 1] = nums2[:j + 1]

为什么是 j + 1

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

🔍 示例图解

示例输入:

nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3

合并过程:

初始:
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]

最终输出:

[1, 2, 2, 3, 5, 6]

⏱️ 时间与空间复杂度

指标说明
时间复杂度O(m + n) — 每个元素最多处理一次
空间复杂度O(1) — 原地合并,不用额外空间

🎯 总结

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

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

📌 推荐写法对比

写法可读性简洁性面试推荐
标准 if/else 写法✅ 高❌ 稍长✅ 推荐
三元表达式写法❌ 稍低✅ 极简✅ 可选(加注释更好)

📎 拓展阅读

  • LeetCode 21 - 合并两个有序链表
  • Python 切片基础讲解

如果你觉得这篇讲解对你有帮助,欢迎点赞、收藏和评论交流!🚀

http://www.xdnf.cn/news/5214.html

相关文章:

  • Java面向对象
  • bcm5482 phy 场景总结
  • 技嘉主板BIOS升级
  • 树 Part 4
  • D. Apple Tree Traversing 【Codeforces Round 1023 (Div. 2)】
  • NX949NX952美光科技闪存NX961NX964
  • 短剧 CPS 分销系统开发搭建,开启流量变现新征程
  • 数字签名与证书
  • 北斗终端设备应用
  • 【含文档+源码】基于SpringBoot的新能源充电桩管理系统的设计与实现
  • ODA服务器计算节点本地硬盘状态异常的处理
  • 【金仓数据库征文】国产数据库KingbaseES安装与使用详解
  • 202535| Kafka架构与重要概念+幂等性+事务
  • [架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
  • kafka的安装及简单使用
  • 【并发编程】基于 Redis 手写分布式锁
  • 【源码+文档+调试讲解】高校创新创业课程124
  • Metasploit 4.22.7:企业级渗透测试新突破
  • 深入了解 ArkTS:HarmonyOS 开发的关键语言与应用实践
  • 装机容量与额定容量区别解析
  • 记录 ubuntu 安装中文语言出现 software database is broken
  • Kubernetes排错(十)-常见网络故障排查
  • OSPF综合性实验
  • 解决 SQL Server 2008 导入 Excel 表卡在“正在初始化数据流”问题
  • 基于DAMA框架的企业文件与内容管理深度解析
  • PyTorch API 5 - 全分片数据并行、流水线并行、概率分布
  • 泛型加持的策略模式:打造高扩展的通用策略工具类
  • 5.1 神经网络: 层和块
  • TWAS / FUSION
  • HTML属性