题目
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-sorted-array/description/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路一:借助Array.sort方法的暴力法
1、将nums2依次添加到num1中
2、使用Arrays.sort()方法对nums1排序
代码
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 时间复杂度高的,但是代码简单的
for(int i=0;i<n;i++){
nums1[m+i] = nums2[i];
}
Arrays.sort(nums1);
}
}
说明:
1、空间复杂度:未额外开辟空间,复杂度为o(1)
2、时间复杂度:Arrays.sort() 这种java自带的排序的背后是快速排序,时间复杂度是O((m+n)log(m+n))。
思路二:双指针法
(直接看图)
代码
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 使用双指针法,时间复杂度低
int end = m+n-1;
int end1 = m-1;
int end2 = n-1;
while(end1>=0 && end2>=0){
// nums1最后的值大,填充到最后
if(nums1[end1]>=nums2[end2]){
nums1[end] = nums1[end1];
end1--;
}else{
// nums2最后的值大,填充到最后
nums1[end] = nums2[end2];
end2--;
}
// 无论哪个值大,因为end都要填充了,所以都需要--
end--;
}
// 处理特殊情况:nums1最小数都比nums2大,即end1<0,end2还没处理完
while(end2>=0){
nums1[end] = nums2[end2];
end2--;
end--;
}
// 因为要在nums1中添加,而且是从后往前添加的,所以此时不需要处理end1的
}
}
说明:
1、空间复杂度:未额外开辟空间,复杂度为o(1)
2、时间复杂度:指针移动单调递减,最多移动 m+n 次,因此时间复杂度为 O(m+n)。