题目描述
给定一个链表,若其中包含环,则输出环的入口节点。
若其中不包含环,则输出null。
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。
则输出环的入口节点3.
思路
1、判断是否存在环
快指针一次走两步,慢指针一次走一步
若存在环,则两指针必会相遇
2、存在环后让慢指针回到起点
由于快指针比慢指针多走了k步,而这k步正好是环的长度,
设相遇点距环的起点的距离为 m,那么环的起点距头结点 head 的距离为 k - m,也就是说如果从 head 前进 k - m 步就能到达环起点。如果从相遇点继续前进 k - m 步,也恰好到达环起点。
所以可以让两指针以同样的速度前进,相遇点即为环的起点
代码实现
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# se