已知两个递增有序的链表A和B,分别表示两个集合。试设计一个算法,用于求出 A与B的交集,并存储在A链表中。例如:La= {2, 4,6,8};Lb={4,6,8,10};Lc = 14,6,8。(要求完整程序代码、输入实例和结果)。用一个较简单的cpp代码实现
时间: 2024-10-18 22:12:43 浏览: 32
为了找到两个递增有序链表A和B的交集,并将结果存储回链表A中,你可以采用双指针法。遍历两个链表,当遇到相同的节点时,将其添加到结果链表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;
ListNode* slow = headA;
ListNode* fast = headB;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
// 如果快慢指针相遇,说明找到了交点,然后从头开始同步移动
if (slow == fast) {
ListNode* current = slow;
ListNode* intersection = nullptr; // 初始化交集节点
// 同步遍历两个链表,直到到达链表末尾
while (current != headA && current != headB) {
intersection = current;
current = current->next;
current = current->next;
}
// 返回第一个交集节点
return intersection;
}
}
// 没有交集,直接返回A的头节点
return headA;
}
// 测试例子
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);
// 打印原始链表
cout << "Original lists:" << endl;
printList(La);
printList(Lb);
// 获取交集并更新链表A
ListNode* resultHead = getIntersectionNode(La, Lb);
if (resultHead) {
cout << "Intersection: ";
printList(resultHead);
} else {
cout << "No intersection." << endl;
}
return 0;
}
```
在这个例子中,给定的链表A和B的交集是 {4, 6, 8},经过上述算法处理后,链表A会变成 {2, 4, 6, 8}。
阅读全文