利用c++,给定两个单链表,编写算法找出两个链表的公共结点,生成详细代码并测试输出。
时间: 2024-10-06 17:04:22 浏览: 58
在C++中,你可以使用哈希集合(如`std::unordered_set`)或者迭代器技巧来找到两个单链表的公共节点。这里是一个简单的示例,首先创建一个哈希集合存储第一个链表的所有节点值,然后遍历第二个链表,如果当前节点值已经在集合中,则找到了公共节点。
```cpp
#include <iostream>
#include <unordered_set>
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
std::unordered_set<int> set;
// 将链表A的所有节点添加到哈希集合
while (headA != nullptr) {
set.insert(headA->val);
headA = headA->next;
}
// 使用迭代器比较两个链表
headA = headB;
headB = headB->next;
while (headB != nullptr) {
if (set.find(headB->val) != set.end()) {
return headB; // 找到了公共节点
}
headA = headA->next;
headB = headB->next;
}
// 如果没有找到公共节点,返回nullptr
return nullptr;
}
int main() {
// 创建两个链表示例
ListNode* listA = new ListNode(4);
listA->next = new ListNode(5);
listA->next->next = new ListNode(6);
listA->next->next->next = new ListNode(7);
listA->next->next->next->next = new ListNode(8); // 公共节点
ListNode* listB = new ListNode(9);
listB->next = new ListNode(10);
listB->next->next = listA->next->next; // 从A链表的第四个节点开始
ListNode* intersection = getIntersectionNode(listA, listB);
if (intersection == nullptr) {
std::cout << "No common node found.\n";
} else {
std::cout << "Common node value: " << intersection->val << "\n";
}
delete listA;
delete listB;
return 0;
}
```
这个程序会输出公共节点的值(在这个例子中是6)。注意,这只是一个基础实现,并未处理特殊情况,例如两个链表长度不同、链表为空等。在实际使用中,你需要考虑这些边界条件。如果你需要测试不同的输入,可以修改`main()`函数中的链表构建部分。
阅读全文