题目
解题思路
用2个指针分别对两个数组同时从后向前遍历,哪个指针指向的数字大,第一个数组尾端的数字就是哪个。举个栗子:
nums1: [4 5 6 0 0 0] 3
nums2: [1 2 3] 3
nums1的指针 p1:2
nums2的指针 p2:2
对nums1从最尾端向前遍历 i = 3 + 3 - 1
1:nums1[p1] > nums2[p2],nums1[i–] = nums1[p1++]:nums1[4 5 6 0 0 6] p1:1p2:2
2:nums1[p1] > nums2[p2],nums1[i–] = nums1[p1++]:nums1[4 5 6 0 5 6] p1:0 p2:2
3:nums1[p1] > nums2[p2],nums1[i–] = nums1[p1++]:nums1[4 5 6 4 5 6] p1:-1 p2:2
4:p1 < 0 && p2 > 0,nums1[i–] = nums2[p2++]:nums1[4 5 3 4 5 6] p1:-1 p2:1
5:p1 < 0 && p2 > 0,nums1[i–] = nums2[p2++]:nums1[4 2 3 4 5 6] p1:-1 p2:0
6:p1 < 0 && p2 > 0,nums1[i–] = nums2[p2++]:nums1[1 2 3 4 5 6] p1:-1 p2:-1
最终结果是[1 2 3 4 5 6]
具体代码
class Solution {
public:
void swap(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int t = nums1[m];
nums1[m] = nums2[n];
nums2[n] = t;
}
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if (!n)
return;
int p1 = m - 1, p2 = n - 1;
for (int i = m + n - 1; i >= 0; i--) {
if (p1 < 0 && p2 >= 0) {
nums1[i] = nums2[p2--];
}
else if (p2 < 0) {
break;
}
else if (nums1[p1] > nums2[p2]) {
nums1[i] = nums1[p1--];
}
else {
nums1[i] = nums2[p2--];
}
}
}
};