题目描述
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为m 和 n。
你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:for
- 将nums2插入到nums1上面
- 遍历nums2,从后向前依次与nums1比较
- 将大的值从nums1的末尾插入
- 可能的一种情况是nums1的值都大于nums2的值,按照一般规律nums2的值都没有插入到nums1中
//.js
var merge = function(nums1, m, nums2, n) {
// 新数组长度
var len = m + n - 1;
// 依次取nums2 的每个元素
for (var i = n - 1; i >=0; i--){
//依次取nums1 的每个元素 ,j == -1 的情况是因为nums2的值小
for(var j = m -1;j >= -1;j--){
// nums2 的元素插入以后 再取nums2 的下一个
if(nums2[i] >= nums1[j] || j == -1){
nums1[len] = nums2[i];
len--;
break;
}
// nums1的值插入后 再取nums1的下一个
else {
nums1[len] = nums1[j];
m--;
len--;
}
}
}
};
时间复杂度:O(m+n)
空间复杂度:O(1)
参考优化 while
- 赋值的代码优化为一行
- 最后使用一个数组拷贝的方法,让代码的可读性更高
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int len = m + n -1;
int p1 = m -1;
int p2 = n -1;
while (p1 >= 0 && p2 >= 0) {
nums1[len--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
}
//可能会出现nums2中的元素小于nums1中的元素,nums2没有全部遍历的可能
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}
}