📜  用于查找两个链表的交点的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:27:11.451000             🧑  作者: Mango

用于查找两个链表的交点的 C++ 程序

本文将介绍如何用 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,该函数输入两个链表的头节点 headAheadB,并返回它们的交点。如果两个链表没有交点,则返回 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 移动到正确的位置。在实际应用中,我们应该尽量避免遍历链表,因为这会造成不必要的时间和空间复杂度。