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

简介: 力扣题目——合并两个有序数组

1. 题目描述

image.png

2. 思路分析

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

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

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

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

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

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

流程演示:
image.png
image.png

3. 代码实现

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--];
}

image.png

相关文章
|
1月前
【数据结构OJ题】环形链表
力扣题目——环形链表
26 3
【数据结构OJ题】环形链表
|
1月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
23 1
【数据结构OJ题】设计循环队列
|
1月前
【数据结构OJ题】有效的括号
力扣题目——有效的括号
25 1
【数据结构OJ题】有效的括号
|
1月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
36 1
【数据结构OJ题】复制带随机指针的链表
|
1月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
14 1
【数据结构OJ题】环形链表II
|
1月前
【数据结构OJ题】相交链表
力扣题目——相交链表
18 1
【数据结构OJ题】相交链表
|
1月前
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
27 0
【数据结构OJ题】用栈实现队列
|
1月前
【数据结构OJ题】用队列实现栈
力扣题目——用队列实现栈
30 0
【数据结构OJ题】用队列实现栈
|
1月前
【数据结构OJ题】链表分割
牛客题目——链表分割
17 0
【数据结构OJ题】链表分割
|
1月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
22 0
【数据结构OJ题】链表的回文结构