各依次输入递增有序若干个不超过100的整数,分别建立两个递增有序单链表,分别表示集合A和集合B。设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并存放于A链表中。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。然后输出求的差集的单链表。测试数据保证结果链表至少存在一个元素。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先在第一行输入数据个数n及n个依次递增有序的不超过100的整数,再在第二行输入数据个数m及m个依次递增有序的不超过100的整数。 输出格式: 对于每组测试,输出A与B的差集的单链表,每两个数据之间留一个空格。
时间: 2024-02-18 16:06:11 浏览: 54
设A和B是两个单链表,其表中元素递增有序
5星 · 资源好评率100%
以下是C++的代码实现,使用了双指针法进行遍历和删除操作,时间复杂度为O(n),空间复杂度为O(1)。
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x): val(x), next(NULL) {}
};
ListNode* createList(int n) {
ListNode* head = new ListNode(0);
ListNode* p = head;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
p->next = new ListNode(x);
p = p->next;
}
return head->next;
}
void printList(ListNode* head) {
ListNode* p = head;
while (p) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
ListNode* difference(ListNode* A, ListNode* B) {
ListNode* dummy = new ListNode(0);
dummy->next = A;
ListNode* p = dummy;
ListNode* q = B;
while (p->next && q) {
if (p->next->val < q->val) {
p = p->next;
} else if (p->next->val == q->val) {
ListNode* temp = p->next;
p->next = p->next->next;
delete temp;
q = q->next;
} else {
q = q->next;
}
}
return dummy->next;
}
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n;
ListNode* A = createList(n);
cin >> m;
ListNode* B = createList(m);
ListNode* diff = difference(A, B);
printList(diff);
}
return 0;
}
```
阅读全文