难度:简单
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
解题思路
由于 nums1 的长度为 m + n, 那么不妨从 nums1 后面从大到小排序。
题解
public void mergeReverseDoublePointer(int[] nums1, int m, int[] nums2, int n) {
int index1 = m - 1;
int index2 = n - 1;
int tailIndex = m + n - 1;
int current;
while (index1 >= 0 || index2 >= 0) {
if (index1 < 0) {
current = nums2[index2--];
} else if (index2 < 0) {
current = nums1[index1--];
} else if (nums1[index1] < nums2[index2]) {
current = nums2[index2--];
} else {
current = nums1[index1--];
}
nums1[tailIndex--] = current;
}
}
测试
@Test
public void test_reverseDoublePointer_case1() {
int[] nums1 = {1, 2, 3, 0, 0, 0};
mergeSortedArray.mergeReverseDoublePointer(nums1, 3, new int[]{2, 5, 6}, 3);
Assertions.assertArrayEquals(new int[]{1, 2, 2, 3, 5, 6}, nums1);
}
@Test
public void test_reverseDoublePointer_case2() {
int[] nums1 = {1};
mergeSortedArray.mergeReverseDoublePointer(nums1, 1, new int[]{}, 0);
Assertions.assertArrayEquals(new int[]{1}, nums1);
}
@Test
public void test_reverseDoublePointer_case3() {
int[] nums1 = {4, 5, 6, 0, 0, 0};
mergeSortedArray.mergeReverseDoublePointer(nums1, 3, new int[]{1, 2, 3}, 3);
Assertions.assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6}, nums1);
}