题目要求

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

将两个有序数组合并至其中一个数组并且该新数组仍然有序。

思路和代码

一般的合并数组,我们会考虑利用一个新数组,并用两个指针分别遍历并顺序比较两个数组的元素,将较小的那个那个元素添加至结果数组之中。
但是此时我们需要将两个数组合并至已存在的一个数组之中,如果还是按照那种方法,我们需要在插入元素之后将当前的元素顺序后移,这回带来巨大的性能损耗。所以我们可以换一种思维方式,从大至小遍历,这样可以将较大的元素直接填入当前的位置而且不用考虑移动其它的元素。这种方法的时间复杂度为O(m+n)
代码如下:

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        
        //nums1的指针
        int pointer1 = m-1 ;
        //nums2的指针
        int pointer2 = n-1 ;
        for(int j = m+n-1 ; pointer1>=0 && pointer2>=0 && j>pointer1 ; j--){
            if(nums2[pointer2] >= nums1[pointer1]){
                nums1[j] = nums2[pointer2--];
            }else{
                nums1[j] = nums1[pointer1--];
            }
        }
        //将剩余的nums2中的元素填入nums[1]
        while(pointer2>=0){
            nums1[pointer2] = nums2[pointer2];
            pointer2--;
        }
    }

总之,挺简单的一道题

clipboard.png
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~


raledong
2.7k 声望2k 粉丝

心怀远方,负重前行