一、题目描述:
具体题目就是为了实现两个数组的有序合并,我们采取三指针做法来解决这个问题:
二、题目分析:
对于题目中给定的变量再次说明numsSize我自己没有用到,所以下面的题目思路将不会出现numsSize
假设有两个数组nums1 , nums2:
因为题目中说了nums1的长度就是m+n的长度,所以我们定义三个变量end1 , end2 , end
我们想要将两个数组中的数进行有序合并的话,那就要将nums2的最大值(位于end2处)与nums1(位于end1处)的最大值进行比较
如果nums2的最大值比较大,那就将nums2的最大值放到nums1的end的位置
如果nums1的最大值比较大,那就将nums1的最大值放到nums1的end的位置
每次放置完了之后,nums1/nums2的位置都要往前挪动一位进行下一轮比较
还有两种情况我们应该了解:
当nums2里面的数值要是有剩余的,那就直接把它们传递到num1相同的位置
代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end = m + n - 1; //nums1的end的位置
int end2 = n - 1; //nums2的end2的位置
int end1 = m - 1; //nums1的end1的位置
while(end1 >= 0 && end2 >= 0){ //当end1或者end2一旦遍历完的时候,说明另一个数组就还剩有元素
if(nums1[end1] > nums2[end2]){ //如果nums1的最大值比nums2的最大值大的话,就将nums1的最大值放在nums1的最后的位置
nums1[end] = nums1[end1];
end--;
end1--;
}else{
nums1[end] = nums2[end2];
end--;
end2--;
}
}
while(end2 >= 0){ //当nums2的元素还有剩余的时候,就直接按照顺序传递到nums1的数组的最前部
nums1[end] = nums2[end2];
end--;
end2--;
}
}