利用c++,不利用哈习表,给定两个单链表,编写算法找出两个链表的公共结点,生成详细代码并测试输出。
时间: 2024-10-06 21:04:36 浏览: 37
在C++中,我们可以使用迭代的方式来寻找两个单链表的公共节点,而不是依赖于哈希表。以下是一个详细的步骤和代码示例:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// 辅助函数,用于比较两个指针是否相等
bool equals(ListNode* a, ListNode* b) {
if (a == nullptr && b == nullptr)
return true;
if (a == nullptr || b == nullptr)
return false;
return a->val == b->val && equals(a->next, b->next);
}
// 找找两个链表的公共节点
ListNode* findIntersectionNode(ListNode* headA, ListNode* headB) {
// 遍历第一个链表
ListNode* slow = headA;
ListNode* fast = headB;
while (fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break; // 如果慢指针追上了快指针,它们相交了
}
if (slow == nullptr || fast == nullptr) // 没有找到公共节点
return nullptr;
// 从头开始遍历第二个链表,直到再次遇到相同的节点
slow = headA;
while (slow != nullptr) {
if (equals(slow, fast)) {
return slow; // 找到了公共节点
}
slow = slow->next;
fast = fast->next;
}
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);
ListNode* listB = new ListNode(5);
listB->next = new ListNode(6);
listB->next->next = new ListNode(8);
listB->next->next->next = new ListNode(9);
ListNode* intersection = findIntersectionNode(listA, listB);
if (intersection != nullptr) {
cout << "Common node found: " << intersection->val << endl;
} else {
cout << "No common node found." << endl;
}
// 清理内存
delete listA;
delete listB;
return 0;
}
```
在这个例子中,我们首先找到两个链表的最短长度,并将较短的那个作为起点。然后分别从这个起点遍历两个链表,当它们的指针相遇时,说明找到了公共节点。如果遍历完整个链表都没有找到公共节点,则返回nullptr。
运行上述代码,会输出公共节点的值(如果有),如果没有公共节点则显示"No common node found."。请注意,这里的代码假设输入链表是非环形的。
阅读全文