力扣(LeetCode) 88: 合并两个有序数组 - 解法思路

问题概述

给你两个按非递减顺序排列的整数数组 nums1nums2。将 nums2 合并到 nums1 中,使合并后的数组同样按非递减顺序排列。nums1 的长度为 m + n,其中前 m 个元素是有效的,后 n 个元素设置为 0 且应被忽略。

解法 1:从末尾双指针(推荐)

工作原理

从两个数组的末尾开始合并,以避免覆盖 nums1 中尚未处理的元素:

python 复制代码
class Solution:
    def merge(self, nums1, m, nums2, n):
        i = m - 1  # nums1 中最后一个有效元素
        j = n - 1  # nums2 中最后一个元素
        k = m + n - 1  # nums1 中最后一个位置
        
        # 从末尾开始合并
        while i >= 0 and j >= 0:
            if nums1[i] > nums2[j]:
                nums1[k] = nums1[i]
                i -= 1
            else:
                nums1[k] = nums2[j]
                j -= 1
            k -= 1
        
        # 复制 nums2 中剩余元素(如果有)
        while j >= 0:
            nums1[k] = nums2[j]
            j -= 1
            k -= 1

复杂度分析

  • 时间复杂度: O(m + n) - 单次遍历两个数组
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 推荐 - 最优解
  • 从末尾合并避免覆盖未处理的元素
  • 处理所有边界情况,包括一个数组为空的情况

关键洞察

从末尾合并至关重要,因为:

  • 如果从开头合并,我们会覆盖 nums1 中尚未处理的元素
  • 通过从末尾开始,我们首先使用 nums1 末尾的额外空间
  • 这确保我们在合并过程中不会丢失任何数据

对比

方法 时间 空间 最佳适用
双指针(末尾) O(m + n) O(1) 大多数情况,最优解

总结

从末尾开始的双指针技术是原地合并有序数组的最优解决方案。这种方法高效地使用 nums1 中的额外空间,而不需要额外的内存。

相关推荐
米粒121 小时前
力扣算法刷题 Day 16
算法·leetcode·职场和发展
重生之后端学习21 小时前
31. 下一个排列
数据结构·算法·leetcode·职场和发展·排序算法·深度优先
Frostnova丶21 小时前
LeetCode 3212. 统计X和Y出现次数相等的子矩阵数量
算法·leetcode·矩阵
We་ct21 小时前
LeetCode 53. 最大子数组和:两种高效解法(动态规划+分治)
前端·算法·leetcode·typescript·动态规划·分治
sin°θ_陈21 小时前
CVPR 2026的3DGS卷到什么地步?工程语义上探:BrepGaussian如何打通图像到CAD的最后一公里?(Part III 1-3)
python·深度学习·算法·机器学习·3d·webgl
shehuiyuelaiyuehao21 小时前
算法9,滑动窗口,长度最小的子数组
数据结构·算法·leetcode
葳_人生_蕤21 小时前
hot100——动态规划
算法·动态规划
Fairy要carry21 小时前
面试-Agent如何压缩上下文
python
sheeta199821 小时前
LeetCode 每日一题笔记 日期:2025.03.18 题目:3070.元素和小于等于k的子矩阵的数目
笔记·leetcode·矩阵
量化炼金 (CodeAlchemy)21 小时前
【交易策略】基于决策树的机器学习策略:从预测价格到预测市场结构
算法·决策树·机器学习