advancing2

题目描述[原题链接][https://leetcode-cn.com/problems/merge-sorted-array/]

给定两个有序整数数组 nums1nums2*,将 *nums2 合并到 nums1使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n*)来保存 *nums2 中的元素。

示例:

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

输出: [1,2,2,3,5,6]

算法描述

记住每个数组的最后一个元素的位置记位r1r2,再用一个变量记住合并后数组的总长度m,当nums1[r1]>nums2[r2]nums1[r1]放在m的位置,不满足之前的情况将nums[r2]放在m的位置,要注意的是每次操作完都要进行后移操作,直到r1、r2有一个变量为-1结束,要注意当r1==-1时需要判断nums2数组有没有合并完,没有要继续进行合并,直到合并结束;

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int l=m-1,r=m+n-1;
int t=n-1;
while(t!=-1&&l!=-1){
if(nums1[l]>nums2[t]){
nums1[r]=nums1[l];
l--;
r--;
}else {
nums1[r]=nums2[t];
t--;
r--;
}
}
if(l==-1){
for(int i=r;i>=0;i--){
nums1[i] = nums2[t];
t--;
}
}
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int r1=m-1,r2=n-1;
int t = m+n-1;
while(r1>-1&&r2>-1){
if(nums1[r1]>nums2[r2]){
nums1[t] = nums1[r1];
r1--;
t--;
}else{
nums1[t] = nums2[r2];
r2--;
t--;
}
}
if(r1==-1){
for(int i = r2;i>-1;i--){
nums1[t] = nums2[i];
r2--;
t--;
}
}
}
}