题目描述

思路一
将数组nums2放进数组nums1的尾部,再对数组进行排序。
这里的排序我们要用到qsort函数,这里简单讲解一下。
头文件:<stdlib.h>
参数(从左往右):数组(传的是指针),元素个数(从前往后),数组元素所占的字节,排序规则。
排序规则:我们通过定义一个函数cmp,通过函数cmp返回的参数来确定排序规则。
cmp函数的参数需要以const void *a,const void *b的形式来定义,表示a和b的类型是未确定的,在return中进行强制类型转换为int型。*(int*)a-*(int*)b表示以递增顺序,若想以递减只需将a和b换位。
有了qsort函数我们就可以对合并以后的数组进行排序了。
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
for(int i=0;i<n;i++)
{
nums1[m+i]=nums2[i];
}
qsort(nums1,nums1Size,sizeof(int),cmp);
}
思路二:
双指针法,利用给出的两个数组是已经排好序的性质,可以依次拿出两个数组头部较小的元素放到新数组中.
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int p1=0;
int p2=0;
int newnums[m+n];
int index=0;
while(p1<m&&p2<n)
{
if(nums1[p1]<nums2[p2])
{
newnums[index++]=nums1[p1++];
}
else{
newnums[index++]=nums2[p2++];
}
}
while(p1<m)
{
newnums[index++]=nums1[p1++];
}
while(p2<n)
{
newnums[index++]=nums2[p2++];
}
for(int i=0;i<m+n;i++)
{
nums1[i]=newnums[i];
}
}
记得题目要求的是将数据存储到nums1中再返回,所以我们需要将新数组的元素复制到nums1中。
思路三:
逆向双指针,我们在思路二中是借用了一个新的数组将排完序的数据存储下来然后再赋值给nums1,那么我们能不能直接排完序后将数据直接给nums1呢?
可以,那么我们就要注意数组nums1中的覆盖问题,但我们通过观察可以发现,nums1中>m的部分都是0,也就是空位,我们可以从后往前覆盖数据:
(1)nums1中最大的元素也比nums2中最小的元素小,那么我们可以直接定义两个逆序指针,一个指向nums2的末尾,一个指向nums1的末尾,将nums2的数据直接覆盖掉nums1中>m的那部分数据。
(2)nums1中存在比nums2中大的数据,那么此时我们需要先找到nums1和nums2中的最大的元素,放到nums1中的最后一位。如果两个数组中最大的元素在nums1中,移动后原处又会空出来一个位置。也就是说:移到另一个空位,又产生了一个新的空位,所以剩余空位的个数是不变的。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int p1=m-1;
int p2=n-1;
int p=m+n-1;
while(p2>=0)
{
if(p1>=0&&nums1[p1]>nums2[p2])
{
nums1[p--]=nums1[p1--];
}
else
{
nums1[p--]=nums2[p2--];
}
}
}