image.png

    1. public static void main(String[] args) {
    2. int[] num1 = new int[]{1,3,5,7,9,0,0,0,0};
    3. int[] num2 = new int[]{2,4,5,8};
    4. System.out.println(Arrays.toString(merge(num1,5,num2,4)));
    5. }
    6. /**
    7. * 时间复杂度是 (m+n)log(m+n)
    8. * @param num1
    9. * @param m
    10. * @param num2
    11. * @param n
    12. * @return
    13. */
    14. private static int[] merge(int[] num1, int m, int[] num2, int n) {
    15. System.arraycopy(num2,0,num1,m,n);
    16. Arrays.sort(num1);
    17. return num1;
    18. }
    public static void main(String[] args) {
    
            int[] num1 = new int[]{1,3,5,7,9,0,0,0,0};
            int[] num2 = new int[]{2,4,5,10};
    
            System.out.println(Arrays.toString(merge1(num1,5,num2,4)));
    
        }
    
        /**
         * 创建一个新数组,将num1中的数据复制过去,然后使用双指针比较新数组和num2的数据大小将数据写入num1中
         * 时间复杂度O(n),空间复杂度O(n)
         * @param num1
         * @param m
         * @param num2
         * @param n
         * @return
         */
        private static int[] merge1(int[] num1, int m, int[] num2, int n) {
            int[] num_temp = new int[m];
            // 将num1中的数据复制到临时数组中
            System.arraycopy(num1,0,num_temp,0,m);
            int index1 = 0,index2 = 0,index_temp = 0;
            // 循环,当临时数组或num2数组中有一个的数据都放入num1中,则终止循环
            while (index_temp < m && index2 < n) {
                num1[index1++] = num_temp[index_temp] > num2[index2] ? num2[index2++] : num_temp[index_temp++];
            }
            // 满足条件,说明num2数组先合并完成,将num_temp剩余的数据直接复制到num1中
            if (index_temp < m) {
                System.arraycopy(num_temp,index_temp,num1,index1,m - index_temp);
            }
            // 满足条件,说明num_temp数组先合并完成,将num2剩余的数据直接复制到num1中
            if (index2 < n) {
                System.arraycopy(num2,index2,num1,index1,n - index2);
            }
    
            return num1;
        }
    
    public static void main(String[] args) {
    
            int[] num1 = new int[]{3,4,5,7,9,0,0,0,0};
            int[] num2 = new int[]{2,4,5,10};
    
            System.out.println(Arrays.toString(merge2(num1,5,num2,4)));
    
        }
    
        /***
         * 使用双指针从数组后往前遍历,然后从num1的后面开始存放
         * 时间复杂度O(n)
         * @param num1
         * @param m
         * @param num2
         * @param n
         * @return
         */
        private static int[] merge2(int[] num1, int m, int[] num2, int n) {
            int index1 = m - 1,index2 = n - 1, index_sum = m + n - 1;
    
            while (index1 >= 0 && index2 >= 0) {
                num1[index_sum--] = num1[index1] > num2[index2] ? num1[index1--] : num2[index2--];
            }
            // 满足条件,说明num1数组先合并完成,将num2剩余的数据直接复制到num1中
            if (index2 >= 0) {
                System.arraycopy(num2,0,num1,0,index2 + 1);
            }
    
            return num1;
        }