题目:
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
将两个数组排序后,均是从小到大,那么此时便可利用双指针进行遍历比较
如:nums1元素为1,2,2,1
nums2元素为2,2
经过排序后:
nums1元素为1,1,2,2
nums2元素为2,2
我们只需要index1,index2分别标记,nums1和nums2此时所处的位置
因为nums1,nums2均是经过排序的,只需要比较双方大小如果,该元素小,则将该元素指向下一位即可,直到其中一个数组循环完毕,如果相等,那么此时要考虑该元素是否已经添加过了,只需要对比是否与上一次存储的元素相等即可,考虑到第一次添加元素,无元素对比,此时只要*returnSize等于0即可
代码如下:
int cmp(const void * e1,const void * e2)
{
return *(int*)e1 - *(int*)e2;
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
qsort(nums1,nums1Size,sizeof(int),cmp);
qsort(nums2,nums2Size,sizeof(int),cmp);
int index1 = 0;
int index2 = 0;
*returnSize = 0;
int* ans = (int*)malloc(sizeof(int) * (nums1Size + nums2Size));
while(index1 < nums1Size && index2 < nums2Size)//其中一个数组遍历完毕即可
{
if(nums1[index1] < nums2[index2])
{
index1++;
}
else if(nums1[index1] > nums2[index2])
{
index2++;
}
else
{
if(!(*returnSize) || nums1[index1]!= ans[*returnSize - 1])//判断是否重复
{
ans[*returnSize] = nums1[index1];
(*returnSize)++;
}
index1++;
index2++;
}
}
return ans;
}