題目要求
給定一個鏈表,判斷鏈表中是否有環。如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 如果鏈表中存在環,則返回入環的結點 。 否則,返回NULL。
思路
設置快慢指針,快指針一次走兩步,慢指針一次走一步,如果有環,快慢指針同時進環後,快指針會追上慢指針,他們的地址會相等,然後,從快慢指針相遇處和鏈表的頭結點處,分別出發兩個指針,均走一步,兩個指針會在入環處相遇,返回該結點即可。
圖解
代碼實現
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode * fast = head;
struct ListNode * slow = head;
while (fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
{
struct ListNode* slowHead = head;
while (slow != slowHead)
{
slow = slow->next;
slowHead = slowHead->next;
}
return slow;
}
}
return NULL;
}