1、已知两个递增有序的链表A和B,分别表示两个集合。试设计一个算法,用于求出A与B的交集,并存储在A链表中。例如 : La = {2, 4,6,8};Lb = {4,6,8,10};Lc = {4,6,8}。(要求完整程序代码、输入实例和结果)。c++语言
时间: 2024-10-07 17:03:36 浏览: 50
在C++中,我们可以使用迭代的方式遍历两个链表,同时检查每个节点是否存在于另一个链表中。如果存在,就将其添加到结果链表C中。以下是完整的C++程序代码:
```cpp
#include <iostream>
using namespace std;
// 链表结构
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if (!headA || !headB) return nullptr;
// 计算两个链表的长度差
int lenA = 0, lenB = 0;
ListNode* pA = headA, *pB = headB;
while (pA != nullptr) {
lenA++;
pA = pA->next;
}
while (pB != nullptr) {
lenB++;
pB = pB->next;
}
// 如果A比B长,让指针移动lenB的距离
if (lenA > lenB) {
pA = headA;
for (int i = 0; i < lenA - lenB; i++) {
pA = pA->next;
}
} else if (lenA < lenB) {
pB = headB;
for (int i = 0; i < lenB - lenA; i++) {
pB = pB->next;
}
}
// 同步两个指针,找到第一个公共节点
while (pA && pB) {
if (pA == pB) {
break;
}
pA = pA->next;
pB = pB->next;
}
return pA;
}
void printList(ListNode* head) {
while (head) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
int main() {
// 示例链表 A 和 B
ListNode* La = new ListNode(2);
La->next = new ListNode(4);
La->next->next = new ListNode(6);
La->next->next->next = new ListNode(8);
ListNode* Lb = new ListNode(4);
Lb->next = new ListNode(6);
Lb->next->next = new ListNode(8);
Lb->next->next->next = new ListNode(10);
// 求交集并打印结果
ListNode* intersection = getIntersectionNode(La, Lb);
if (intersection) {
cout << "Intersection: ";
printList(intersection);
} else {
cout << "No common elements found." << endl;
}
// 清理内存
delete La;
delete Lb;
return 0;
}
```
输入示例:La 链表为 `{2, 4, 6, 8}`,Lb 链表为 `{4, 6, 8, 10}`。预期输出:`Intersection: 4 6 8`
阅读全文