已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集C(即仅由在A中出现而不在B中出现的元素所构成的集合),并将差集C以同样的形式存储,同时返回该集合C的元素个数。
输入格式:
输入两组数据为元素递增的数组,并构成两个链表A和B。
每一组数据的第一行输入数组长度,第二行输入递增数组。
输出格式:
输出链表C表示的差集的长度和元素。
输入样例:
5
1 3 5 7 9
3
2 3 5
输出样例:
3
1 7 9
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createList(int arr[], int len) {
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
head->val = arr[0];
head->next = NULL;
ListNode *cur = head;
for (int i = 1; i < len; i++) {
cur->next = (ListNode *)malloc(sizeof(ListNode));
cur->next->val = arr[i];
cur->next->next = NULL;
cur = cur->next;
}
return head;
}
int diffSet(ListNode *A, ListNode *B, ListNode **C) {
ListNode *curA = A;
ListNode *curB = B;
ListNode *curC = NULL;
ListNode *preC = NULL;
int count = 0;
while (curA != NULL && curB != NULL) {
if (curA->val < curB->val) {
if (curC == NULL) {
curC = (ListNode *)malloc(sizeof(ListNode));
curC->val = curA->val;
curC->next = NULL;
preC = curC;
} else {
curC->next = (ListNode *)malloc(sizeof(ListNode));
curC->next->val = curA->val;
curC->next->next = NULL;
preC = curC;
}
count++;
curA = curA->next;
} else if (curA->val > curB->val) {
curB = curB->next;
} else {
curA = curA->next;
curB = curB->next;
}
}
while (curA != NULL) {
if (curC == NULL) {
curC = (ListNode *)malloc(sizeof(ListNode));
curC->val = curA->val;
curC->next = NULL;
preC = curC;
} else {
curC->next = (ListNode *)malloc(sizeof(ListNode));
curC->next->val = curA->val;
curC->next->next = NULL;
preC = curC;
}
count++;
curA = curA->next;
}
*C = curC;
return count;
}
int main() {
int lenA, lenB;
scanf("%d", &lenA);
int arrA[lenA];
for (int i = 0; i < lenA; i++) {
scanf("%d", &arrA[i]);
}
scanf("%d", &lenB);
int arrB[lenB];
for (int i = 0; i < lenB; i++) {
scanf("%d", &arrB[i]);
}
ListNode *A = createList(arrA, lenA);
ListNode *B = createList(arrB, lenB);
ListNode *C = NULL;
int count = diffSet(A, B, &C);
printf("%d\n", count);
while(C!=NULL)
{
printf("%d ", C->val);
C=C->next;
}
printf("\n");
return 0;
}