C语言刷题--合并有序数组

cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
        // 定义三个指针,逻辑和之前一致
    int p1 = m - 1;    // nums1有效元素末尾
    int p2 = n - 1;    // nums2有效元素末尾
    int p = m + n - 1; // nums1合并后的填充位置末尾

    // 从后往前比较,填充较大值
    while (p1 >= 0 && p2 >= 0) {
        if (nums1[p1] >= nums2[p2]) {
            nums1[p] = nums1[p1];
            p1--;
        } else {
            nums1[p] = nums2[p2];
            p2--;
        }
        p--;
    }

    // 处理nums2剩余元素(nums1先遍历完的情况)
    while (p2 >= 0) {
        nums1[p] = nums2[p2];
        p2--;
        p--;
    }
}

该代码实现了两个有序数组合并的功能。

算法使用三指针法,从数组末尾开始比较和填充,将较大的元素依次放入nums1的末尾。

当nums1的元素先比较完时,直接将nums2剩余元素复制到nums1前端。

这种方法无需额外空间,时间复杂度为O(m+n),是合并有序数组的高效解决方案。

相关推荐
LabVIEW开发2 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
身如柳絮随风扬6 分钟前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
AI科技星7 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅9 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程23 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
Java小生不才37 分钟前
Spring AI文生音
java·人工智能·spring
凯尔萨厮40 分钟前
Springboot2.x+Thymeleaf项目创建
java
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
fish_xk1 小时前
map和set
java·开发语言
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数