算法训练营第七天 | 环形链表 扭捏快指针步步退,霸道慢指针狠狠追
今日算法题:142. 环形链表 II
编写代码前想法:
在刚看到题目的时候,我觉得题目重点是如何判断链表是否有环,我初步判断应该是利用while() 进行判断,但如果没有环,该利用什么条件来进行判断的退出,没有一个合适的判断条件,可能会造成无限循环;如果将判断环的循环限制在一定范围内,那么假设有一个长度非常大的环,循环没来得及判断完就到达限制点,岂不是会造成误判无环。
在视频教程学习后,我还明白了使用快慢指针判断链表是否有环的操作方法,并知晓了找到环的第一个节点才是重点,使用双指针找入口其代码实现也更复杂些。
代码编写如下:
总结:
本题核心解决两个问题:一为判断链表是否存在环;二为找到环的入口节点。
解题第一步:快慢指针判断环的存在:
分别定义快慢指针,均从链表头 head 出发,若链表有环,快指针一定会在环内追上慢指针。若快指针遇到 NULL,说明链表无环,直接返回 NULL。
解题第二步:寻找环的入口节点:
从链表头和相遇点同时出发,每次各走 1 步,两个指针一定会在环的入口节点相遇。
题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/ 视频链接:https://www.bilibili.com/video/BV1if4y1d7ob
