一开始看到题目的时候不理解什么是非递减顺序排列,于是百度,上面给出的解释是非递减顺序排列即是指:数列递减,但不是单调递减,中间可以有重复。 了解了什么是非递减顺序排列之后便开始构思解题思路。
其中nums1的大小是由nums1目前的元素个数以及nuums2的元素个数相加组成的,nums1中暂时多出来的空间用0表示。C编译给出的函数参数如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
其中nums1和nums2就是要合并的两个有序数组,后者合并入前者。我的思路很笨,就是依次拿第二个数组的元素与第一个数组里面的元素依次比较,遇到比自己大的元素或者超过了第一个数组组元素的个数之后就将其并入比自己的大的元素前面或者数组末尾。
注意:第一个数组的元素个数m会随着第二个数组元素的不断并入而增大。
代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
if(n==0)
return ;
int *ptr1 = nums1,*ptr2 = nums2,pos1=0,pos2=0,left=m,count=0;
while(count<n)
{
while(*(ptr2+pos2)>*(ptr1+pos1)&&pos1<left)
{
pos1++;
}
if(pos1>=left)
*(ptr1+pos1)=*(ptr2+pos2);
if(*(ptr2+pos2)<=*(ptr1+pos1))
{
for(int i=m+count;i>pos1;i--)
{
*(ptr1+i)=*(ptr1+i-1);
}
*(ptr1+pos1)=*(ptr2+pos2);
}
left++;
pos2++;
count++;
}
}
最终结果如下:
欢迎讨论或指正错误~