LC88:合并两个有序数组
和归并排序比较类似,但是这个是在原来的数组中进行的,不能够开辟额外的空间
步骤:
- 设置指针
k
指向合并后数组num1
的最后一个元素,设置指针i
指向合并前nums1
数组的最后一个元素,q
指向数组nums2
的最后一个元素 - 比较
i
和j
这两个指针指向值的大小,将两者中较大的值放进nums1
中 - 每进行一次步骤2的操作
k
向前移动一格,i
或j
中的一个也向前移动一格 - 循环直到
i=0
或j=0
- 如果
nums1
走完了,但是nums2
还没走完(j >= 0
)将nums2
中的剩余数直接移动到nums1
中即可
时间复杂度:O(m + n) 空间复杂度: O(1)
代码:
var merge = function(nums1, m, nums2, n) {
let k = m + n - 1, i = m - 1, j = n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] >= nums2[j]) {
nums1[k --] = nums1[i --];
} else {
nums1[k --] = nums2[j --];
}
}
while (j >= 0) {
nums1[k --] = nums2[j --];
}
return nums1;
};
题外话:当然可以使用三元表达式,看起来更简单 但这不是重点
LC调试代码的快捷键:ctrl + ’; 提交的快捷键:ctrl + enter