LeetCode_88_合并两个有序数组
廖家龙 用心听,不照做

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

示例:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]

提示:
1. nums1.length == m + n
2. nums2.length == n
3. 0 <= m, n <= 200
4. 1 <= m + n <= 200
5. -10^9 <= nums1[i], nums2[i] <= 10^9

解法1:三指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:

//a++和++a都是将a加1,但是a++返回值a,++a返回值为a+1
//⭐️如果只是希望增加a的值,而不需要返回值,则推荐使用++a,其运行速度会略快一些
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {

//因为这两个数组已经排好序,我们可以把两个指针分别放在两个数组的末尾,即nums1的m-1位和nums2的n-1位
//每次将较大的那个数字复制到nums1的后边,然后向前移动一位。因为我们也要定位nums1的末尾,所以我们还需要第三个指针,以便复制
int pos = m-- + n-- -1;

while (m >= 0 && n >= 0) {
nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
}

//[0] 0 [1] 1
while (n >= 0) {
nums1[pos--] = nums2[n--];
}
}
};