一个链表中包含环,请找出该链表的环的入口结点。
思路一:使用一前一后两个指针,两个指针相差n步,n代表环中结点的数目,这两个指针相遇的结点刚好是环的入口。如何得到环中结点的数目?使用一快一慢两个指针,如果这两个指针相遇,表明链表中存在环,并且相遇的结点一定在环内,可以从这个结点出发,一边走一边计数。
思路二:使用一快一慢一两个指针,如果两个指针相遇,将快指针指向链表头部,慢指针位置不变,快慢指针以相同速率向前走,两个指针相遇的位置就是环的入口。证明如下:
(证明过程牛客网上搬的,原始链接貌似失效了…)
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
if pHead:
pSlow, pFast = pHead, pHead
while pFast != None and pFast.next != None:
pSlow = pSlow.next
pFast = pFast.next.next
if pSlow == pFast:
break
if pFast == None or pFast.next == None:
return None
pFast = pHead
while pSlow != pFast:
pSlow = pSlow.next
pFast = pFast.next
return pSlow
1811

被折叠的 条评论
为什么被折叠?



