LeetCode:88. 合并两个有序数组

简介

题目链接:https://leetcode.cn/problems/merge-sorted-array/description/

解决方式:数组 + 双指针

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐查看灵茶山艾府大佬所作题解。

双指针

解题思路:双指针。不过与以往不同的是,此处双指针是倒序遍历数组。因为根据题目可知,数组是非严格递增的,最后一个元素是该数组最大的元素。我们从后往前遍历,可以很好的利用到 nums1 数组后面空出来的空间,而且移动元素都是有效操作。如果我们从前往后遍历,会出现每次都需要移动后面元素的情况,很多无效的移动操作,不如从后往前遍历高效。

java 复制代码
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // p1 指向 nums1 最后有效元素,p2 指向 nums2 最后元素,p 指向 nums1 最后元素
        int p1 = m - 1;
        int p2 = n - 1;
        int p = m + n - 1;
        // 一直迭代,直到 nums2 中的所有元素合并到 nums1
        while(p2 >= 0){
            // 如果 p1 元素大于 p2,则 p1 元素移到 nums1 数组的最后,反之亦然
            if(p1 >= 0 && nums1[p1] > nums2[p2]){
                // 有可能出现 p1 的元素都比 p2 小,所以需要判断 p1 >= 0
                nums1[p--] = nums1[p1--];
            }else{
                nums1[p--] = nums2[p2--];
            }
        }
    }
}
相关推荐
啥都想学点的研究生9 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂9 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康9 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备10 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.10 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫10 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
hetao173383711 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法
云淡风轻~窗明几净11 小时前
宇宙管理学猜想
算法·图论
春风解人意11 小时前
从零开始学习嵌入式P28----线程
c语言·学习·算法
luj_176811 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法