【快慢指针】142. 环形链表 II
题目
解析
// 快慢指针法:给定两个指针,分别命名为slow fast 起始位置在链表的开头
// 每次fast前进两步,slow前进一步。如果fast可以走到尽头,那么说明没有环路;
// 如果fast 可以无限的走下去说明一定有环路,且一定存在某一个时刻slow与fast相遇。当slow和fast
// 第一次相遇的时候,fast重新移动到链表开头,并让slow和fast每一次都前进一步。当slow和fast第二次相遇
// 相遇的节点即为环路的开始点
代码
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *slow = head,*fast = head;
do{
if(!fast || !fast->next) return nullptr;
fast = fast->next->next;
slow = slow->next;
}while(fast != slow);
fast = head;
while(fast != slow)
{
slow = slow->next;
fast = fast->next;
}
return fast;
}
};
|