算法:合并两个有序数组

这道题的核心思想:

利用数组已经有序的特点,采用"从后往前填充"的贪心思想,每次选择当前最大的元素放到合并数组的最后位置。

因为 nums1 后面有预留空间,如果从前往后合并,会导致原来的元素被覆盖,需要不断移动数据。因此选择逆向遍历

nums1nums2 的最后一个有效元素开始比较;

当前两个元素中较大的那个,一定应该放在合并数组的最后空位;

放入后,继续向前比较剩余元素;

直到所有元素都移动到正确位置。

本质上就是:

利用有序数组的性质,每次确定当前最大值的位置,通过双指针从尾部向前构造最终有序数组。

这种方法避免了额外空间,也避免了元素移动,所以能够在 O(m+n) 时间复杂度、O(1) 空间复杂度 下完成合并。

cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i=m-1;
    int j=n-1;
    int k=m+n-1;
    while(i>=0&&j>=0)
    {
        if(nums1[i]>nums2[j])
        {
            nums1[k--]=nums1[i--];
        }
        else
        {
            nums1[k--]=nums2[j--];
        }
    }
    while(i>=0)
    {
        nums1[k--]=nums1[i--];
    }
    while(j>=0)
    {
        nums1[k--]=nums2[j--];
    }
    
}
相关推荐
shehuiyuelaiyuehao5 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民7 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾7 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP7 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin8 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_108 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
纪念 2299 小时前
数据结构排序(三)
数据结构
船厂电气自动化ai大模型9 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳10 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66610 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法