如果一个链表有环,求环入口结点,否则返回NULL
之前熟悉的一种解法是:
1)先快慢指针法得到相遇点,必然是环上一点,
2)在此处将环断开,问题转化为相交链表求交点的问题。
3)分别求2个链表长度,长的链表先走len1- len2 步,然后一起走,相遇点就是交点。
最近发现的一个解法:
1)快慢指针法得相遇点
2)一个指针从相遇点往后移动,另一指针从head往后移动,相遇点即环入口
ListNode *detectCycle(ListNode *head) {
if (!head || !head->next) return NULL;
auto p = head, q=head;
while (q && q->next) {
p = p->next;
q = q->next->next;
if (p == q) break;
}
if (p != q) return NULL;
for (p = head; p != q; p = p->next, q=q->next);
return p;
}