给定两个数组nums1和nums2,长度分别为n和m,要求输出二者的交集,交集中每个元素唯一,且按照从小到大的顺序排列。其中n,m<=20,且两数组一定有交集。 输入输出格式如下: 输入: 3,5 4 9 5 9 4 9 8 4 输出 4 9
时间: 2023-05-15 10:06:42 浏览: 94
以下是C知道的回答:
可以使用哈希表来解决这个问题。首先将nums1中的所有元素存入哈希表中,然后遍历nums2,如果当前元素在哈希表中存在,则将其加入结果集中。最后将结果集按照从小到大的顺序排序即可。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 20
int nums1[MAX_N], nums2[MAX_N];
int n, m;
typedef struct Node {
int val;
struct Node* next;
} Node;
Node* createNode(int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
node->next = NULL;
return node;
}
void insert(Node** head, int val) {
Node* node = createNode(val);
node->next = *head;
*head = node;
}
void printList(Node* head) {
while (head) {
printf("%d ", head->val);
head = head->next;
}
}
void freeList(Node* head) {
while (head) {
Node* tmp = head;
head = head->next;
free(tmp);
}
}
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
void intersection(int* nums1, int n, int* nums2, int m, int* resSize, int** res) {
Node* hash[MAX_N] = {0};
for (int i = 0; i < n; i++) {
insert(&hash[nums1[i] % MAX_N], nums1[i]);
}
Node* head = NULL;
for (int i = 0; i < m; i++) {
Node* p = hash[nums2[i] % MAX_N];
while (p) {
if (p->val == nums2[i]) {
insert(&head, nums2[i]);
break;
}
p = p->next;
}
}
*resSize = 0;
*res = (int*)malloc(sizeof(int) * MAX_N);
while (head) {
(*res)[(*resSize)++] = head->val;
head = head->next;
}
qsort(*res, *resSize, sizeof(int), cmp);
}
int main() {
scanf("%d,%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &nums1[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d", &nums2[i]);
}
int* res;
int resSize;
intersection(nums1, n, nums2, m, &resSize, &res);
printList(res, resSize);
free(res);
return 0;
}
```
输入样例:
```
3,5
4 9 5
9 8 4
```
输出样例:
```
4 9
```
希望这个回答能够帮助到你!
阅读全文