mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 13:00:22 +08:00
0142.环形链表II:添加C语言实现
This commit is contained in:
@ -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;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
Reference in New Issue
Block a user