一、代码
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
二、分析
法一:思路:把数组2的元素复制到数组1里面,然后把数组1进行排序
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i = 0; i< n ;i++){
nums1[m] = nums2[i];
m++;
}
Arrays.sort(nums1);
for(int i = 0; i < nums1.length; i++){
System.out.print(nums1[i]);
}
}
}
法二:参照别人的代码
时间复杂度为m+n,但是申请了一个m+n的空间。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//有两个指针分别指向指向两个数组的第一个元素,然后重新申请一个新的数组,当数组1的元素值<数组2的元素值,把数组1的值加到新数组里面,反之,把数组2加到新数组里面,同时,这里还有一个问题就是,如果数组1已经全部遍历完,则直接将数组2直接加在新数组后面
int p = 0;
int q = 0;
int[] arr = new int[m+n];
int temp;//用来暂存nums1和nums2的值
while(p < m || q < n){//当p或q没到数组的末尾时,我们进行把数组1、2的元素放入新数组里面,只有当p或q都达到末尾,循环才结束
if(p == m){
temp = nums2[q++];
}else if(q == n){
temp = nums1[p++];
}else if(nums1[p] < nums2[q]){
temp = nums1[p++];//先使用p,使用后p自增
}else {
temp = nums2[q++];
}
arr[p+q-1] = temp;
}
for(int i = 0; i < m+n; i++){
nums1[i] = arr[i];
}
}
}