因为一定是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)
}
浙公网安备 33010602011771号