每日算法:88. 合并两个有序数组

247 阅读1分钟

难度:简单

给你两个有序整数数组 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);
}