腾讯25-环形链表 II

腾讯25-环形链表 II leetcode142

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

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

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

这道题就是求环形链表的入口。

在这里插入图片描述
这张中,快慢结点第一次在z点处相遇,
则慢结点走过a+b,快结点走过a+b+c+b
因为能相遇,则快结点走过的距离必然是慢结点的两倍,(必然是整数倍,第一次就是2倍)。
则2(a+b)=a+b+c+b,得出a=c,而我们要求的就是a,
于是我们让慢结点回到起点head,同时快结点在z点速度变慢成一倍速,这样,快慢结点同样各自走a和c的路程,而a=c,会在Y点相遇。即为所求。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        if head is None or head.next is None :
            return None
        else:
            fast,slow=head,head
            while(fast is not None and fast.next is not None ):
                fast=fast.next.next
                slow=slow.next
                if fast==slow:
                    slow=head
                    while(fast!=slow):
                        fast=fast.next
                        slow=slow.next
                    return slow
            return None
发布了93 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zlb872551601/article/details/103644755
今日推荐