【数据结构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--];
}
相关推荐
计算机安禾1 分钟前
【c++面向对象编程】第1篇:从C到C++:面向对象编程思想入门
c语言·c++·算法
Master_oid2 分钟前
机器学习41:利用KNN算法实现手写数字识别
深度学习·算法·机器学习
OYangxf11 分钟前
力扣hot100【子串专题】
算法·leetcode·职场和发展
WL_Aurora17 分钟前
Python 算法基础篇之元组与列表
python·算法
知识分享小能手17 分钟前
R语言入门学习教程,从入门到精通,R语言数据结构(4)
数据结构·学习·r语言
Brilliantwxx18 分钟前
【算法题】递归树+哈希表+分治异或+双指针
开发语言·c++·笔记·算法
yugi98783818 分钟前
经典三维表面重建算法(C语言实现)
c语言·开发语言·算法
程序猿编码20 分钟前
Linux 高负载场景下 Web 服务访问日志极速定位工具实现解析(C/C++代码实现)
linux·服务器·c语言·前端·c++
无限进步_21 分钟前
【C++】智能指针族谱:auto_ptr、unique_ptr、shared_ptr
java·开发语言·数据结构·c++·算法
LuminousCPP22 分钟前
C 语言文件操作全攻略:从基础读写到随机访问与缓冲区原理
c语言·经验分享·笔记·文件操作