diff --git a/problems/0142.环形链表II.md b/problems/0142.环形链表II.md index 60bb10b7..fb2172c6 100644 --- a/problems/0142.环形链表II.md +++ b/problems/0142.环形链表II.md @@ -33,11 +33,11 @@ ### 判断链表是否有环 -可以使用快慢指针法, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 +可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢 -首先第一点: **fast指针一定先进入环中,如果fast 指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。** +首先第一点:**fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。** 那么来看一下,**为什么fast指针和slow指针一定会相遇呢?** @@ -328,5 +328,26 @@ extension ListNode: Equatable { } ``` +C: + +```c +ListNode *detectCycle(ListNode *head) { + ListNode *fast = head, *slow = head; + while (fast && fast->next) { + // 这里判断两个指针是否相等,所以移位操作放在前面 + slow = slow->next; + fast = fast->next->next; + if (slow == fast) { // 相交,开始找环形入口:分别从头部和从交点出发,找到相遇的点就是环形入口 + ListNode *f = fast, *h = head; + while (f != h) f = f->next, h = h->next; + return h; + } + } + return NULL; +} +``` + + + -----------------------