题目
解析
用双指针法较容易解决,这里不详述
python代码
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1 = m-1
p2 = n-1
pos = m+n-1
while p1>=0 and p2>=0:
if nums1[p1]>nums2[p2]:
nums1[pos] = nums1[p1]
p1-=1
else:
nums1[pos] = nums2[p2]
p2-=1
pos-=1
nums1[:p2+1] = nums2[:p2+1]
C++版本
这边C++的版本有一个注意点,可以使用m–这种trick来加快速度。m–和--m不同在于,m–返回值是m,而–m返回值是m-1.也就是说如果a=m–这个表达式中,a会等于m的值,但是复制结束后m的值会减1
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos = m-- + n-- -1;
while(m>=0 && n>=0){
nums1[pos--] = nums1[m]>nums2[n]? nums1[m--]:nums2[n--];
}
while(n>=0){
nums1[pos--] = nums2[n--];
}
}
};