將兩個 array 有順序的合併再一起
額外開一個空間,放排完後的結果
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1=0, p2=0; // 宣告指針
vector<int> ans(m+n,0);
int cur; // 佔存目前最小的值
while (p1<m || p2<n){
// 可能條件:
// nums1[p1]<nums2[p2] => 把nums1[p1]排到新arr
// nums1[p1]>=nums2[p2] => 把nums2[p2]排到新arr ->這個條件我放最後else寫
// nums1跑完了 => => 把nums2[p2]排到新arr (檢查邊界要先寫,不然最後會超出邊界爆錯)
// nums2跑完了 => => 把nums1[p1]排到新arr (檢查邊界要先寫,不然最後會超出邊界爆錯)
if(p2 == n){
cur = nums1[p1];
p1++;
}else if(p1 == m){
cur = nums2[p2];
p2++;
}else if(nums1[p1]<nums2[p2]){
cur = nums1[p1];
p1++;
}else{
cur = nums2[p2];
p2++;
}
// 統一放
ans[p1+p2-1] = cur;
}
// 最後再倒回去
for(int i=0;i<m+n;i++){
nums1[i] = ans[i];
}
}
};
將裡個 array 由後面往前去比較,必較大的往後丟 => 省一個空間
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1=m-1, p2=n-1; // 宣告指針
int tail =(m+n)-1; // 尾巴的那根指針
while(p1>-1 ||p2>-1){
int cur; // 紀錄p1 p2較大的那個值
if(p1==-1){
cur = nums2[p2];
p2--;
}else if (p2 == -1) {
cur = nums1[p1];
p1--;
}else if(nums1[p1] > nums2[p2]){
cur = nums1[p1];
p1--;
}else{
cur = nums2[p2];
p2--;
}
nums1[tail] = cur;
tail--;
}
}
};