LeetCode算法题: 合并两个有序数组merge

给定两个有序整数数组 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:和替换字符串中的空格相似,https://blog.csdn.net/weixin_43777983/article/details/102297962
如果是从前向后判断的话,要移动多次数组中的元素,时间复杂度比较高;
如果是从后向前判断,定义双指针分别指向两个元素,因为两个数组已经是有序的,两个数组尾部的元素是该数组中最大的,比较两个元素的大小,大的放到nums1数组的末尾,然后移动相应的指针,如此往复,每个元素至多被移动一次,时间复杂度为O(n)

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1,p2 = n - 1,length = nums1.length - 1;
        while(p1 >= 0 && p2 >= 0) {
            if(nums2[p2] > nums1[p1]) {
                nums1[length--] = nums2[p2--];
            }else if(nums2[p2] < nums1[p1]) {
                nums1[length--] = nums1[p1--];
            }else{
                nums1[length--] = nums2[p2--];
                nums1[length--] = nums1[p1--];
            } 
        }
        //如果nums1元素个数为0,就把nums2的元素加入到nums1中
        while(p2 >= 0){
            nums1[length--] = nums2[p2--];
        }
    }
}

你可能感兴趣的:(LeetCode算法题: 合并两个有序数组merge)