Leetcode 142:环形链表 II(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/83866910

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

**说明:**不允许修改给定的链表。

进阶:
你是否可以不用额外空间解决此题?

解题思路

这是之前问题Leetcode 141:环形链表(最详细的解法!!!)的提高,我们还是采用快慢指针来做。

我们建立两个指针,一个slow一个fast,我们令移动速度关系为 V f a s t = 2 V s l o w V_{fast}=2*V_{slow} ,我们假设环的长度为 V s l o w t i m e V_{slow}*time 的倍数k,如果此时slowfast都在环内的话,那么在一定时间内两者必定可以相遇(使用相对速度很好理解)。如果此时slow的起点是在环的初始点(例如前面例子中的3),那么fastslow最后一定会在起点相遇(因为 V s l o w t i m e k % V s l o w V_{slow}*time*k\%V_{slow} 一定为0,其中后面的 V s l o w V_{slow} 为相对速度)。我们现在的问题就变成了如何判断slow在环的初始点,这也非常简单,我们再简历一个entry指针,当slow==fast的时候,我们判断slow==entry,如果是的话,那么entry即为环的初始点,否则的话我们将entry++;slow++;,判断下一个位置是不是环的起始点。

class Solution:
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head == None:
            return None

        fast, slow, entry = head, head, head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                while slow != entry:
                    slow = slow.next
                    entry = entry.next

                return entry
        return None

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/83866910
今日推荐