题目分析:将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中剩余的元素