【数据结构OJ题】合并两个有序数组

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

目录

[1. 题目描述](#1. 题目描述)

[2. 思路分析](#2. 思路分析)

[3. 代码实现](#3. 代码实现)


1. 题目描述

2. 思路分析

看到这道题,我们注意到nums1 和nums2 两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp ,依次比较两个数组的元素,每次取小的尾插到新数组tmp 即可。但是这需要额外再开空间。

也有一种方法是将这两个数组的元素都拷贝到一起,然后使用qsort排序 复杂度为O(NlogN)。

显然这两种方法的复杂度都不够优秀,是否有更好的方法呢?

我们可以**倒着比较,取大的依次往前插入。**等到有一个数组被遍历完,就结束。

因为两个数组都是非递减的,nums1 数组的长度比nums2 大,所以如果nums1 先被遍历完,就将nums2 没有被遍历的元素直接拷贝到nums1 前面。

如果nums2 先被遍历完,则不用额外操作(因为nums1 整体本身就是非递减的,所以那些没有被遍历到的元素也是按非递减排列的)。

流程演示:

3. 代码实现

cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = m - 1, end2 = n - 1, end = m + n - 1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums1[end1] >= nums2[end2])
            nums1[end--] = nums1[end1--];
        else
            nums1[end--] = nums2[end2--];
    }
    while (end2 >= 0)
        nums1[end--] = nums2[end2--];
}
相关推荐
春弦_14 小时前
自用算法整理二
数据结构·算法·图论
hetao173383715 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn15 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
Navigator_Z16 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
卡卡~~16 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
学逆向的17 小时前
C 多文件开发
c语言·开发语言·网络安全
企业数字化笔记17 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
学逆向的17 小时前
C 内存属性
c语言·开发语言·算法·网络安全
Zwawa18 小时前
一盏 LED 不够用了:让同一盏灯说出不同的话
c语言·单片机·嵌入式