Leetcode 142环形链表II
题目描述:
给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回NULL。(不适用额外的空间)
题解:
Floyd 算法
1. 用快慢指针法找出列表是否有环。
2. 利用step.1找到的相遇节点找出环的入口。
step.2的证明我就直接偷leetcode上题解给的图了
AC代码:
class Solution { public: ListNode* fisrtM(ListNode* head) { ListNode* slow; ListNode* faster; slow = faster = head; while(faster != NULL) { slow = slow->next; if(faster->next == NULL) return NULL; faster = faster->next->next; if(slow == faster) return slow; } return NULL; } ListNode *detectCycle(ListNode *head) { if(head == NULL) return NULL; ListNode* fm = fisrtM(head); if(fm == NULL) return NULL; ListNode* ans = head; while(ans != fm) { ans = ans->next; fm = fm->next; } return ans; } };