原题目链接:https://leetcode-cn.com/problems/merge-sorted-array/
做题思路一
- 准备好三个指针p1,p2,p3,指针意思就是指向下标的针线,设置指针的目的是为了方便定位,当前数组比较到了哪个元素。
图里面里面的0,1,2,3是指下标
-
先把nums1拷贝一份,然后比较nums1_copy[p1]和nums2[p2]的大小
2.1 如果nums1_copy[p1] < nums[p2] ,就把nums1_copy[p1]的元素放入nums1[p3]的位置,然后p1++,p3++
2.2 如果nums1_copy[p1] >= nums[p2] ,就把nums2[p2]的元素放入nums1[p3]的位置,然后p2++,p3++ -
题目给出的nums1元素个数和nums2元素个数不一定相同,也就是说m不一定会等于n,所以就会导致可能某一个多元素数组只比较了一部分,剩下的都没有比较,由于nums1数组和nums2数组都是有序数组,所以可以直接把剩下的没比较的元素,直接移动到数组后面
废话不多说,直接上代码,我的代码里加了大量的注释,相信各位看官可以理解,如果我有些没写清楚或者写错的,可以评论区或者私信我喔
//把nums1数组复制一份,这样就把nums1数组当成空数组放排好序的数据
int[] nums1_copy = new int[m];
//开始拷贝
System.arraycopy(nums1,0,nums1_copy,0,m);
//准备三个指针
int p1 = 0; //nums1_copy数组用的
int p2 = 0; //nums2数组用的
int p3 = 0; //nums1数组用的
//开始判断大小
while(p1 < m && p2 < n){
//小的先放
nums1[p3++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
}
//如果只有一个数组比较完,也就是说还有另一个数组没有比较完,就直接添加
//解释一下m + n - p1 - p2的意思,m + n就是nums1的长度
//p1指针所指位置往左都是已经比较完的数据,同理p2也是
//所以m + n - p1 - p2得出的结果就是还没比较数据元素个数
if(p1 < m){
System.arraycopy(nums1_copy,p1,nums1,p1 + p2,m + n - p1 - p2);
}
if(p2 < n){
System.arraycopy(nums2,p2,nums1,p1 + p2,m + n - p1 - p2);
}
做题思路二
- 准备三个指针,p1指向nums1的尾部元素,p2指向nums2的尾部元素,p3指向最终合并后数组的尾部元素
这里图把nums1当成最终合并后的数组,题目给出的nums1有足够的空间存储m+n个元素,所以是可以的
- 当p1 >= 0的时候,nums1[p1]和nums2[p2]进行比较
2.1 当nums1[p1] >= nums2[p2]的时候,将nums1[p1]上的元素放入nums1[p3],然后p1- -,p3- -
2.2 当nums1[p1] < nums2[p2]的时候,将nums2[p2]上的元素放入nums1[p3],然后p2- -,p3- - - 当p1 < 0的时候,由于两个数组本身就是有序数组,所以可以直接把没比较的元素直接放入后面,nums1[p3] = nums2[p2],然后p3- -,p2 - -
- 循环结束条件是p2 < 0
废话不多说,直接上代码
int p1 = m - 1; int p2 = n - 1; int p3 = m + n -1;
while(p2 >= 0){
if(p1 >= 0 && nums1[p1] > nums2[p2]){
nums1[p3--] = nums1[p1--];
}else{
nums1[p3--] = nums2[p2--];
}
}