1. class Solution {
    2. public void merge(int[] nums1, int m, int[] nums2, int n) {
    3. // nums后面是空的,可以使用逆向双指针。
    4. // m-=1,n-=1表示一开始的下标
    5. // 存在当nums1[]前m个数为0的情况,所以可以是负数。n也如此。
    6. int k = m + n - 1;
    7. m -= 1;
    8. n -= 1;
    9. // 只要有一方没结束,那就继续。
    10. while (m >= 0 || n >= 0) {
    11. int cur = 0;
    12. // 因为可能为负,先处理一下
    13. if (m == -1) {
    14. cur = nums2[n--];
    15. } else if (n == -1) {
    16. // 这种情况是因为num2加入完毕之后,剩余的num1本来就是排好序的
    17. break;
    18. } else if (nums1[m] >= nums2[n]) {
    19. cur = nums1[m--];
    20. } else {
    21. cur = nums2[n--];
    22. }
    23. nums1[k--] = cur;
    24. }
    25. }
    26. }