https://leetcode.com/problems/intersection-of-two-linked-lists/
将其中一条链表首尾相接,然后对另外一条链表进行环路检测。如果两个链表相交,那么另外一条链表就是带环链表,否则无环。问题转化为linked list cycle II了。
记得最后将链表复原。
C++
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
ListNode *tailB = headB;
while (tailB->next) tailB = tailB->next;
tailB->next = headB;
ListNode *ret = detect_cycle(headA);
tailB->next = NULL;
return ret;
}
ListNode *detect_cycle(ListNode *head) {
bool is_cycle = false;
ListNode *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { is_cycle = true; break; }
}
if (!is_cycle) return NULL;
ListNode *start = head;
while (start != slow) {
slow = slow->next;
start = start->next;
}
return start;
}
};