### 思路:先[判断是否有环](https://www.kancloud.cn/persuez/algorithm/858057),无环返回 nullptr,有环则有以下方法:记相遇点为pos,然后同时从链头和pos点出发,它们的相遇点即为环的入口点。证明如下:设从链头到环入口点(连接点)的步数为 x(包括两个端点x + 1个节点),连接点到相遇点的步数为 y,慢指针走了 s 步,那么s = x + y,快指针走了2s = x + n * t + y(n 为走环的圈数,t 为环中步数(从连接点出发回到连接点),得到 x + y = nt,所以同时从链头和pos点出发,它们的相遇点即为环的入口点。实现代码如下:
```
// meetingNode函数在之前的对应章节有,思路中有链接可以跳转过去
SList* findEntryForLoop(SList *list)
{
if (list == nullptr) {
return nullptr;
}
SList *meetingNode = meetingNode(list);
if (meetingNode == nullptr) {
return nullptr;
}
// 循环直至相遇,通过以上证明,循环一定会结束
while (list != meetingNode) {
list = list->m_next;
meetingNode = meetingNode->m_next;
}
return list;
}
```