LeetCode-88. 合并两个有序数组——给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
法一:先合并再排序
将两个数组合并之后再排序。
复杂度分析
时间复杂度 : O((n + m)log(n + m))。
空间复杂度 : O(1)。
法二:双指针-从前向后
将指针p1 置为 nums1的开头, p2为 nums2的开头,在每一步将最小值放入输出数组中。
复杂度分析
时间复杂度 : O(n + m)。
空间复杂度 : O(m)。
法三:双指针-从后向前
法二的时间复杂度O(n + m)O(n+m),但需要使用额外空间,空间复杂度为。
如果从结尾开始改写 nums1 的值就不需要额外空间了。指针 p 用于追踪添加元素的位置。
复杂度分析
时间复杂度 : O(n + m)。
空间复杂度 : O(1)。
// An highlighted block
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// i记录nums1数组的最后一个, 从后往前放,选取较大的数放在数组后面
int i1 = m-1;
int i2 = n-1;//数组nums2长度
int i = m+n-1;
while( i1>=0 && i2>=0 ){
if(nums1[i1]>nums2[i2]){
nums1[i--] = nums1[i1--];
}
else{
nums1[i--] = nums2[i2--];
}
}
//将数组nums2的剩余元素复制到数组nums1中
while(i2>=0){
nums1[i--] = nums2[i2--];
}
}
};`
LeetCode题解
链接: link.