天天看点

88. Merge Sorted Array 合并两个有序数组

题目分析:将2个有序的数列合并成一个有序的数列。思路就是从2个数列的末尾开始看,比较哪个大,将最大的数作为合并到nums1的最后一位数,以此类推,遍历完其中一个数列结束,最后判断nums2是否为空来判断合并是否完成,因为全部合到nums1中,所以只需要判断nums2就行

C++:

这里有个用multiset的方法,利用容器的特点去解

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    //multiset
//    if(m == 0)
//    {
//        swap(nums1,nums2);
//        return;
//    }

    int len1 = m - 1;
    int len2 = n - 1;
    int len = n + m - 1;

    while (len1 >= 0 && len2 >= 0){
        nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
    }

    while (len2 >= 0){
        nums1[len--] = nums2[len2--]; #合并nums2剩余元素
    }
}
           

Python:

这里在自己的编译器写的时候出现了错误:

list assignment index out of range

这是因为题目中直接给出了n+m长度的nums1,出了后面n个元素全为0,所以不需要判断nums1是否为空,也不需要在nums1后面再加n个0元素初始化,所以题解代码没有出错。

而编译器我在写的时候没有这样输入,只是给个nums1,m个元素所以nums[n+m+1]超出m个元素后面的是没有初始化元素的,直接赋值则会出现越界的错误,需要用插入的方式赋值。

list的插入可以用:

1.extend:用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)

2.append:用于在列表末尾添加新的对象

3.insert:用于将指定对象插入列表的指定位置

4.直接加

或者可以自己给后面的元素初始化为0

L = [0]*n
    nums1 += L
           
def merge(nums1: list, m: int, nums2: list, n: int):
    len1 = m - 1
    len2 = n - 1
    len = n + m - 1


    while len1 >= 0 and len2 >= 0:
        if nums1[len1] >= nums2[len2]:
            nums1[len] = nums1[len1]
            len1 -= 1
            len -= 1
        else:
            nums1[len] = nums2[len2]
            len2 -= 1
            len -= 1


    if len2 >= 0:
        nums1[:len2+1] = nums2[:len2+1] #合并nums2中剩余的元素