88. Merge Sorted Array

一、题目

  1、审题

  2、分析

    给出有序整数数组 nums1、nums2,将 nums2 中元素放入 nums1 中,且使得nums1仍然有序,假使 nums1 空间足够大。

二、解答

  1、思路:

    方法一、

      将 nums1 与 nums2 依次进行比较,将小的数放在 nums1 从下标为 0 开始的位置,大的数值放入 nums2 并在nums2中进行排序。

      最终 nums2 中的 n 个数均比 nums1 中的 m 个数大,在将 nums2 数放入 nums1 即可。

public void merge(int[] nums1, int m, int[] nums2, int n) {
        
        if(n == 0)
            return;
        if(m == 0) {
            for (int i = 0; i < n; i++) {
                nums1[i] = nums2[i];
            }
        }
            
        int i = 0;
        
        while(i < m) {

            if(nums1[i] > nums2[0]){
                
                int tmp = nums1[i];
                nums1[i] = nums2[0]; 
                
                int k = 1;
                if(n == 1 || tmp <= nums2[k])
                    nums2[0] = tmp;
                else {
                    while(k < n && tmp > nums2[k]){
                        nums2[k-1] = nums2[k++];
                    }
                    nums2[k-1] = tmp;
                }
            }
            
            i++;
        }
        i = 0;
        while(i < n) 
            nums1[m++] = nums2[i++];
    }

  

  方法二、

    将 nums1 与 nums2 均从数组末尾开始比较,将大的数放在nums1从 m+n-1 的位置并依次向前。

  

public void merge(int[] nums1, int m, int[] nums2, int n) {
        
        int i = m-1, j = n-1;
        while(i >= 0 && j >= 0) {
            if(nums1[i] >= nums2[j]){
                nums1[i+j+1] = nums1[i];
                i--;
            } else {
                nums1[i+j+1] = nums2[j];
                j--;
            }
        }
        
        while(j >= 0)
            nums1[j] = nums2[j--];
        
    }

  

原文地址:https://www.cnblogs.com/skillking/p/9700770.html