因为一定是a私有+share bpri+share,把两个链接之后,要不就直接碰到share,要不就在遍历过

#include <iostream>

// 链表节点结构定义
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

// 1. 判断链表是否为环形链表(Floyd判圈算法)
bool hasCycle(ListNode *head) {
    if (head == nullptr || head->next == nullptr) {
        return false; // 空链表或单节点无环
    }

    ListNode *slow = head;         // 慢指针(每次1步)
    ListNode *fast = head->next;   // 快指针(每次2步,初始超前一步)

    while (slow != fast) {
        // 快指针到达末尾,无环
        if (fast == nullptr || fast->next == nullptr) {
            return false;
        }
        slow = slow->next;
        fast = fast->next->next;
    }

    // 快慢指针相遇,有环
    return true;
}

// 2. 寻找两链表的交点(若存在)
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    if (headA == nullptr || headB == nullptr) {
        return nullptr; // 任一链表为空,无交点
    }

    ListNode *pA = headA;
    ListNode *pB = headB;

    // 交叉遍历:pA遍历完A则转B,pB遍历完B则转A
    while (pA != pB) {
        pA = (pA == nullptr) ? headB : pA->next;
        pB = (pB == nullptr) ? headA : pB->next;
    }

    return pA; // 相遇点(交点或nullptr)
}