2.(选做)假设两个链表La和Lb分别表示两个集合A和B,如何实现 A=A ∩B ? 怎么写代码
时间: 2024-10-24 18:15:50 浏览: 5
2_链表_求la和lb的交集_
5星 · 资源好评率100%
为了实现两个链表(集合A和B)的交集A=A∩B,我们可以创建一个新的链表来存储它们的公共元素。以下是使用C++的伪代码描述:
```cpp
// 定义链表节点结构
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 函数用于合并两个已排序链表并找到交集
ListNode* findIntersection(ListNode* la, ListNode* lb) {
ListNode* slow = la;
ListNode* fast = lb;
// 如果其中一个链表比另一个长,快指针可以在较长链表上快速前进
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
break;
}
}
// 如果慢指针追上了快指针,说明存在交点,现在从头开始对比两个链表
if (!fast || !slow) {
slow = la;
if (fast) fast = lb;
else fast = la;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
}
// 创建新链表存储交集,初始化为 nullptr
ListNode* result = new ListNode(0);
ListNode* tail = result;
// 从la和lb的交点开始,比较节点值
while (slow && fast) {
if (slow->val == fast->val) {
tail->next = slow;
tail = tail->next;
slow = slow->next;
fast = fast->next;
} else if (slow->val < fast->val) {
slow = slow->next;
} else {
fast = fast->next;
}
}
// 返回结果链表的头结点(可能空)
return result->next;
}
```
这段代码首先通过快慢指针找到两个链表的第一个公共节点。然后遍历这两个链表,如果遇到相同的节点值,则添加到新的交集链表中。注意,这里假设输入链表已经是升序排列的,如果不是,你需要先对链表进行排序。
阅读全文