1、双指针
为了实现 O ( m + n ) O(m+n) O(m+n)的时间复杂度,我们可以从后向前来进行双指针的操作。我们分别从两个数组的末端向前进行比较,将较大值放到数组1的末端,这样做可以避免从前向后进行比较时出现位置被占用的情况。我们在进行逆序操作时,值得注意的是,我们需要考虑其中一个数组已经排序完而另一个数组尚未进行排序的情况,此时我们可以判断指针是否指向一个负值,若是则只需要将另一个数组完全复制过来即可。
class Solution {
public:
void merge(vector<int> &nums1, int m, vector<int> &nums2, int n) {
int index1 = m - 1, index2 = n - 1, index = n + m - 1, cur;
while (index1 >= 0 || index2 >= 0) {
if (index2 < 0) cur = nums1[index1--];
else if (index1 < 0) cur = nums2[index2--];
else if (nums1[index1] >= nums2[index2]) {
cur = nums1[index1--];
} else {
cur = nums2[index2--];
}
nums1[index--] = cur;
}
}
};