题目:一个链表中包含环,请找出该链表的环的入口结点。
输入为链表头,即下图的1。
如图,找到入环点3。
解析:参考力扣(力扣)
分析第一次相遇,设快指针走了m圈环,慢指针走了n圈环
那么
快指针走了:a + (b+c)m + b
慢指针走了:a + (b+c)n + b
根据快走的是慢的两倍,a + (b+c)m + b = 2(a + (b+c)n + b)
化简为:a = (b+c)(m-2n) - b
就是说,a的距离等于(环长度的倍数 - b),或者说,a = 环长度倍数 + c
那么P1走了a,刚好能遇到走了(环长度的倍数 - b,或者说是“环长度倍数 + c”)的P2。
也就是说,当慢指针走了长度为a时,快指针走过了c,并又绕环几圈,回到了入环点。
一般情况下,在第一次相遇前,快指针每次走的步>=2,第二次,快指针每次走步数为1。
代码:
def detectCycle(self, head):
fast = slow = head
# 检测是否有环
while fast and fast.next:
slow, fast = slow.next, fast.next.next
if slow is fast:
break
else:
return None
# 找出入口节点
while head is not slow:
head, slow = head.next, slow.next
return head
---------------------------------------------------------------------------------------
反转链表:
代码:
def reverseList(head):
prev = None
while head:
head.next, prev, head = prev, head, head.next
return prev