leetcode-环形链表2

题目描述

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

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

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

官方解法(Floyd算法)

分为两步,第一步利用快慢指针,如果是环则返回相遇点;第二步还是两指针,一个在链头,一个在相遇点,之后以相同速度移动,相遇时即为链表进入环的位置。
下面摘了几个官方图:
leetcode-环形链表2_第1张图片
leetcode-环形链表2_第2张图片
leetcode-环形链表2_第3张图片
leetcode-环形链表2_第4张图片
leetcode-环形链表2_第5张图片
leetcode-环形链表2_第6张图片
leetcode-环形链表2_第7张图片
leetcode-环形链表2_第8张图片
leetcode-环形链表2_第9张图片
leetcode-环形链表2_第10张图片

python实现

class Solution(object):
    def getIntersect(self, head):
        tortoise = head
        hare = head
        while hare is not None and hare.next is not None:
            tortoise = tortoise.next
            hare = hare.next.next
            if tortoise == hare:
                return tortoise

        return None

    def detectCycle(self, head):
        if head is None:
            return None

        intersect = self.getIntersect(head)
        if intersect is None:
            return None
        ptr1 = head
        ptr2 = intersect
        while ptr1 != ptr2:
            ptr1 = ptr1.next
            ptr2 = ptr2.next

        return ptr1

总结

该问题相对于环形链表1就是进一步来让我们理解快慢指针并明确快慢指针最后的结果,并利用快慢指针做更深入的运用,包括找到环的入口点。还有这个拉开一定距离的双指针的思想,利用该方法还可以找到链表倒数第几个结点。

参考链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode/
来源:力扣(LeetCode)

你可能感兴趣的:(leetcode)