题目来源
https://leetcode.cn/problems/linked-list-cycle-ii/
题目描述
题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
思路
这里参考代码随想录
1.判断是否存在环
使用快慢指针,如果两指针可以相遇,说明存在环
2.找出环的开始节点(入环点)
通过画图推理,可以得出快慢指针相遇的节点与入环点的距离(next方向)和头结点与入环点的距离一致。所以在判断存在环后,分别用两个指针指向头结点和相遇节点,同时向前进,直到相遇,就是入环点
代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 如果相遇
if slow == fast:
p = head
q = slow
while p!=q:
p = p.next
q = q.next
#你也可以re turn q
return p
return None