题目
思路
集合法
- 将节点存入set,若重复出现则说明是环
快慢指针法
- 分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
- 初次相遇后,将slow设为头结点,slow和fast这两个指针每次只走一个节点, 当这两个指针相遇的时候就是环形入口的节点。
代码
集合法
python
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
node_set = set()
current = head
while current:
if current in node_set:
return current
else:
node_set.add(current)
current = current.next
return None
快慢指针法
python
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# If there is a cycle, the slow and fast pointers will eventually meet
if slow == fast:
# Move one of the pointers back to the start of the list
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
# If there is no cycle, return None
return None