給定兩個單鏈表頭節點,找到它們的交點(引用相同,非值相同)。無交點返回 null。要求 O(n) 時間、O(1) 空間,保持原結構不變。
原理:對齊後,兩指針到交點距離相等,若無交點最終同為 null。
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if (!headA || !headB) return nullptr;
// 1. 計算長度
int lenA = 1, lenB = 1;
ListNode *pA = headA, *pB = headB;
while (pA->next) { ++lenA; pA = pA->next; }
while (pB->next) { ++lenB; pB = pB->next; }
// 2. 快速判斷無交點:尾節點不同
if (pA != pB) return nullptr;
// 3. 對齊起點
pA = headA; pB = headB;
if (lenA > lenB) {
int diff = lenA - lenB;
while (diff--) pA = pA->next;
} else if (lenB > lenA) {
int diff = lenB - lenA;
while (diff--) pB = pB->next;
}
// 4. 同步查找
while (pA != pB) {
pA = pA->next;
pB = pB->next;
}
return pA; // 交點或 null
}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if (!headA || !headB) return nullptr;
ListNode *pA = headA, *pB = headB;
while (pA != pB) {
pA = pA ? pA->next : headB;
pB = pB ? pB->next : headA;
}
return pA;
}
原理:pA 走完 A 再走 B,pB 走完 B 再走 A,總長度均為 lenA+lenB,必在交點或 null 相遇。代碼極簡,無需顯式計算長度。