力扣-142 环形链表Ⅱ

题目:
给定一个链表的头节点 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, head
        isCycle = False
        while fast is not None and fast.next is not None:
            fast = fast.next.next
            slow = slow.next
            # 找到重合的位置
            if fast == slow:
                isCycle = True
                break
        if not isCycle:
            return None
        fast = head
        while fast != slow:
            fast = fast.next
            slow = slow.next
        return fast
上一篇:C# SQL Server EF框架增删改查


下一篇:myeclipse find replace