📅  最后修改于: 2023-12-03 15:27:11.451000             🧑  作者: Mango
本文将介绍如何用 C++ 编写一个函数,用于查找两个链表的交点。本文将从实现算法的角度出发,逐步介绍如何查找两个链表的交点。
假设我们有两个链表 A 和 B,两个链表的长度可能不同。我们的目标是找到两个链表的交点。如果两个链表相交,那么相交的节点之后,链表 A 和链表 B 中的节点都是相同的。
我们首先需要遍历链表 A 和 B,计算它们的长度。接着,我们将指针 pA 和 pB 分别指向链表 A 和 B 的头节点。我们将指针 pA 向前移动 lenA - lenB 步,使得指针 pA 和指针 pB 所在的位置相同。然后,我们同时遍历链表 A 和 B,直到指向同一个节点为止。
为了实现上述算法,我们需要定义一个链表节点类 ListNode
,如下所示:
class ListNode {
public:
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
我们需要编写一个函数 getIntersectionNode
,该函数输入两个链表的头节点 headA
和 headB
,并返回它们的交点。如果两个链表没有交点,则返回 NULL
。函数的实现如下所示:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 计算链表 A 和链表 B 的长度
int lenA = 0, lenB = 0;
for (ListNode *p = headA; p != NULL; p = p->next) {
lenA++;
}
for (ListNode *p = headB; p != NULL; p = p->next) {
lenB++;
}
// 将指针 pA 和 pB 分别指向链表 A 和链表 B 的头节点
ListNode *pA = headA, *pB = headB;
// 将指针 pA 向前移动 lenA - lenB 步
if (lenA > lenB) {
for (int i = 0; i < lenA - lenB; i++) {
pA = pA->next;
}
} else {
for (int i = 0; i < lenB - lenA; i++) {
pB = pB->next;
}
}
// 同时遍历链表 A 和链表 B,直到指向同一个节点为止
while (pA != NULL && pB != NULL) {
if (pA == pB) {
return pA;
}
pA = pA->next;
pB = pB->next;
}
return NULL;
}
我们现在来测试一下这个函数的正确性。我们假设链表 A 和链表 B 的结构如下图所示:
链表 A:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
链表 B: 8 -> 9 -> 5 -> 6 -> 7
在这个例子中,链表 A 和链表 B 的交点为节点 5。我们现在来测试一下这个例子:
int main() {
// 创建链表 A:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
ListNode *headA = new ListNode(1);
headA->next = new ListNode(2);
headA->next->next = new ListNode(3);
headA->next->next->next = new ListNode(4);
headA->next->next->next->next = new ListNode(5);
headA->next->next->next->next->next = new ListNode(6);
headA->next->next->next->next->next->next = new ListNode(7);
// 创建链表 B: 8 -> 9 -> 5 -> 6 -> 7
ListNode *headB = new ListNode(8);
headB->next = new ListNode(9);
headB->next->next = headA->next->next->next->next;
// 查找链表 A 和链表 B 的交点
ListNode *intersection = getIntersectionNode(headA, headB);
// 输出交点的值
cout << intersection->val << endl; // 输出 5
return 0;
}
在这个例子中,函数 getIntersectionNode
返回的结果是正确的,我们成功找到了链表 A 和链表 B 的交点。
本文介绍了如何用 C++ 编写一个用于查找两个链表的交点的函数。具体来说,我们介绍了算法的思路,并给出了代码实现和测试样例。需要注意的是,我们需要遍历两个链表,计算它们的长度。否则,我们将无法将指针 pA 和指针 pB 移动到正确的位置。在实际应用中,我们应该尽量避免遍历链表,因为这会造成不必要的时间和空间复杂度。