方法一:原地,额外空间O(1)
从nums1尾部开始插入。
- 考虑极端情况:
- 如果nums1前m个所有数都比nums2中的数大,尾部放完nums1的前m个数后,前面还剩n个空放nums2
- 如果nums2所有数都比nums1中的前m个数大,尾部放完nums2的n个数后,前面还剩m个空放nums1
- 再考虑中间的情况,x个数来自nums1, y个数来自nums2,nums1中的空位 = m + n - (x + y), nums1中剩下的数 = .....
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 || j >= 0) {
int num1 = i >= 0 ? nums1[i] : Integer.MIN_VALUE;
int num2 = j >= 0 ? nums2[j] : Integer.MIN_VALUE;
if (num1 >= num2) {
nums1[k] = num1;
i--;
} else {
nums1[k] = num2;
j--;
}
k--;
}
}
}
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] >= nums2[j]) {
nums1[k] = nums1[i];
i--;
k--;
} else {
nums1[k] = nums2[j];
j--;
k--;
}
}
while (i >= 0) {
nums1[k] = nums1[i];
i--;
k--;
}
while (j >= 0) {
nums1[k] = nums2[j];
j--;
k--;
}
}
}
方法二:新开个数组,空间 O(N)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (n == 0) return;
int[] tmp = new int[m];
System.arraycopy(nums1, 0, tmp, 0, m);
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (tmp[i] <= nums2[j]) {
nums1[k] = tmp[i];
i++;
} else {
nums1[k] = nums2[j];
j++;
}
k++;
}
while (i < m) {
nums1[k] = tmp[i];
k++;
i++;
}
while (j < n) {
nums1[k] = nums2[j];
k++;
j++;
}
}
}