https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

<aside> 💡

思路:如果两个链表尾部相交,那么他们的尾部一定相同。所以只比较尾部即可。

  1. 计算A、B链表的长度
  2. 移动长链表的指针,使得两个链表的指针与它们的尾部距离相同
  3. 同步移动两个链表的指针,直到找到相交点或到达尾部 </aside>

思路如图:

image.png

ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
    // 1.计算AB两个链表的长度
    int sizeA = 0, sizeB = 0;
    for (ListNode* tmp = headA; tmp; tmp = tmp->next) {
        ++sizeA;
    }
    for (ListNode* tmp = headB; tmp; tmp = tmp->next) {
        ++sizeB;
    }

    // 2.将A和B移到距尾节点相同距离的位置
    if (sizeA > sizeB) {
        for (int i = 0; i < sizeA - sizeB; ++i) {
            headA = headA->next;
        }
    } else {
        for (int i = 0; i < sizeB - sizeA; ++i) {
            headB = headB->next;
        }
    }

    // 3.A和B共同向前遍历链表直到相遇或到达尾后节点
    while (headA) {
        if (headA == headB) {
            break;
        }
        headA = headA->next;
        headB = headB->next;
    }
    return headA;
}