142 环形链表
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
重点在于如何判断是否有环,采用快慢指针的做法,快指针每次走2步,慢指针每次走1步,快指针相对慢指针每次多走一步,这样确保如果有环一定会相遇。
再就是如何去找环入口的位置 ,重点在于公式的推导,得到结论x=z,考虑设置index1为快慢指针相遇的位置,index2是head,index1到环入口的位置与head到环入口的位置距离相同,两者同时移动,相遇即为环入口位置。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
fast = head
slow = head
while(fast != None and fast.next != None):#fast每次移动2,所以要看fast及其下一个位置是不是都不为空
fast = fast.next.next
slow = slow.next
if fast == slow:
index1 = fast
index2 = head
while(index1 != index2):
index1 = index1.next
index2 = index2.next
return index1
return None