原题地址:

https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-150

题解:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int tail = m + n - 1;
    int p1 = m - 1;
    int p2 = n - 1;
    //什么情况下结束,只要两个不在最前就继续
    while (p1 >= 0 || p2 >= 0) {
        if (p1 == -1) {//结束条件判定,长度不一样时
            nums1[tail--] = nums2[p2--];
        } else if (p2 == -1) {//结束条件判定,长度不一样时
            nums1[tail--] = nums1[p1--];
        } else {
            nums1[tail--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
        }
    }
}

注意点:

  1. 非递减,意思就是最后一个肯定是最大的,且肯定是最后一个位置,不在变化,也就提供了解题思路,从后面放数据。

  2. 分而治之,最后一个位置放完后,集合-1。依此类推。