民治做网站哪家便宜/报个计算机培训班多少钱
题目:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回null。
思路:
(1)假设链表有a+b个结点(从head到链表环入口共a个结点,链表环共b个结点);
(2)设快、慢指针分别走了f、s
步,那么会有以下两个结论:
f=2*s
f=s+n*>b
<----快指针多走了n个环的长度;
(3)由(2)可得,s=n*b
;
(4)再假设,我们从head指针开始,一直走到环的入口,共走了k步,那么k=a+n*b
,此时由于慢指针slow已经走了n*b
步(s=n*b
),因此其只需要再走a步即可;
(5)因此,再构建一个指针,指向head,与slow一起向前走,二者相遇的地点,即为环的入口。
class Solution:def detectCycle(self, head: ListNode) -> ListNode:fast, slow = head, headisCycle = Falsewhile fast is not None and fast.next is not None:fast = fast.next.nextslow = slow.next# 找到重合的位置if fast == slow:isCycle = Truebreakif not isCycle:return Nonefast = headwhile fast != slow:fast = fast.nextslow = slow.nextreturn fast