合并两个有序数组_力扣

题目描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出:
[1,2,2,3,5,6]

解法一:

直接将两数组合并,然后再对 nums1 中所有元素进行排序。但这样做没有利用两数组本身有序的条件。

代码实现:

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

解法二:

由于最后元素都要放入到数组 nums1 中,所以先将 nums1 中元素放入其他数组(nums)中以备使用。定义 x 、y 分别指向 nums 和 nums2 的开头,每次向后移动过程中将较小值放入 nums1 中。

代码实现:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums=new int[m];
        System.arraycopy(nums1,0,nums,0,m);

        int x=0,y=0,z=0;
        while((x<m)&&(y<n)){
            nums1[z++]=nums[x]<nums2[y]?nums[x++]:nums2[y++];
        }

        if(x<m){
            System.arraycopy(nums,x,nums1,x+y,m+n-x-y);
        }
        if(y<n){
            System.arraycopy(nums2,y,nums1,x+y,m+n-x-y);
        }
    }
}
发布了71 篇原创文章 · 获赞 2 · 访问量 7480

猜你喜欢

转载自blog.csdn.net/weixin_42512675/article/details/104527643