法一:双指针,小的插入新建的数组
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1=0,p2=0;
int s[m+n];
int cur = 0;
while(p1<m||p2<n){
if(p1==m){
cur = nums2[p2++];
}else if(p2==n){
cur = nums1[p1++];
}else if(nums1[p1]<nums2[p2]){
cur = nums1[p1++];
}else {
cur = nums2[p2++];
}
s[p1+p2-1] = cur;
}
for(int i = 0;i!=m+n;i++){
nums1[i] = s[i];
}
}
};
法二:三指针,尾插 空间O(1)
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
};