88. 合并两个有序数组

132 阅读1分钟

方法一:原地,额外空间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++;
        }
    }
}