题目

88. 合并两个有序数组

题解






代码

import java.util.*;

public class code88 {

    // public static void merge(int[] nums1, int m, int[] nums2, int n) {
    // System.arraycopy(nums2, 0, nums1, m, n);
    // Arrays.sort(nums1);
    // }

    // public static void merge(int[] nums1, int m, int[] nums2, int n) {
    // for (int i = m, j = 0; (i < m + n) && (j < n); i++, j++) {
    // nums1[i] = nums2[j];
    // }
    // Arrays.sort(nums1);
    // }

    // public static void merge(int[] nums1, int m, int[] nums2, int n) {
    // int len1 = m - 1;
    // int len2 = n - 1;
    // int len = m + n - 1;
    // while (len1 >= 0 && len2 >= 0) {
    // if (nums1[len1] > nums2[len2]) {
    // nums1[len] = nums1[len1];
    // len1--;
    // len--;
    // } else if (nums1[len1] <= nums2[len2]) {
    // nums1[len] = nums2[len2];
    // len2--;
    // len--;
    // }
    // }
    // System.arraycopy(nums2, 0, nums1, 0, len2 + 1);
    // }

    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        //先归并大的,这样一遍扫描即可。 
        for (int k = m + n - 1, i = m - 1, j = n - 1; k >= 0; k--) {
            if (i < 0) {
                nums1[k] = nums2[j];
                j--;
                continue;
            }
            if (j < 0) {
                nums1[k] = nums1[i];
                i--;
                continue;
            }
            // 当 if(j < 0) 的时候,就可以直接跳出循环了,因为后面的值都是它自身的
            // if(j < 0)
            // {
            // break;
            // }
            
            if (nums1[i] >= nums2[j]) {
                nums1[k] = nums1[i];
                i--;
            } else if (nums1[i] < nums2[j]) {
                nums1[k] = nums2[j];
                j--;
            }
        }
    }

    public static void main(String[] args) {
        int nums1[] = { 1, 2, 3, 0, 0, 0 };
        int m = 3;
        int nums2[] = { 2, 5, 6 };
        int n = 3;
        merge(nums1, m, nums2, n);
        System.out.println(Arrays.toString(nums1));
    }
}

参考

  1. 合并两个有序数组——题解一
  2. 画解算法:88. 合并两个有序数组——题解二
  3. 从尾部开始合并,每次找出最大的,这样一遍扫描即可完成——题解三
  4. 思路没有创新的地方,主要提供逻辑清楚的代码和编码细节(Python 代码、Java 代码)——题解四
  5. System.arraycopy的使用方法详解