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