1. 题目:合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
2. 思路:
双指针原地合并,由于非递减的特性从后往前比较,(插入时依然是谁更大就在后面
① JavaScript代码:
var merge = function mergeNum(nums1,m,nums2,n){
let p1 = m-1;
let p2 = n-1;
let p = m+n-1;
while(p1>=0 && p2>=0){
if(nums1[p1]>nums2[p2]){
nums1[p]=nums1[p1];
p1--;
}
else{
nums1[p]=nums2[p2];
p2--;
}
p--;
}
while(p2>=0){
nums1[p]=nums2[p2];
p2--;
p--;
}
};
② python代码:
def merge (num1,m,nums2,n):
p1 = m - 1
p2 = n - 1
p = m + n - 1
while p1 >= 0 and p2 >= 0:
if nums1[p1] > nums2[p2]:
nums1[p] = nums1[p1]
p1 -= 1
else:
nums1[p] = nums2[p2]
p2 -= 1
p -= 1
# 如果 nums2 还有剩余元素,将它们复制到 nums1 的前面
while p2 >= 0:
nums1[p] = nums2[p2]
p2 -= 1
p -= 1
个人认为关键是要考虑到nums2中还有剩余元素时的情况:
此时的p在哪个位置?要理解nums1[p]=nums2[p2]背后的原因。