#剑指offer#链表中环的入口节点:1,设置一个快的指针,一个慢的指针,若相遇,代表有环 2、设置新的指针,和慢指针再次重合即为节点
程序员文章站
2022-06-17 16:16:26
...
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
1、设置一个快的指针(每次走两步),一个慢的指针(每次走一步),若重合,代表有环
2、设置新的指针,以和慢指针相同速度分别从链表头和重合点出发,和慢指针再次重合即为入口节点
a:链表头到入口的步数
b:入口到重合点的步数
c:重合点到入口的步数
m:慢指针的圈数
k:快指针的圈数
慢指针的步数=a+(b+c)*m+b
快指针的步数=a+(b+c)*k+b
因为快指针步数是慢指针两倍,所以:
a+(b+c)*k+b=(a+(b+c)*m+b)2
化简得:a=(k-m)(b+c)-b
(k-m)>=0
所以其实a的长度就等于c的长度
所以两个分别从表头和重合点相遇的指针同时以相同的速度出发,相遇点即为环入口
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
p = pHead
q = pHead
flag = False
while p.next !=None and q.next.next != None:
p = p.next
q = q.next.next
if p == q:
flag = True
break
q = pHead
if flag:
while p!=q:
p = p.next
q = q.next
return p
上一篇: AngularJS实现路由实例
下一篇: 剑指offer-不用加减乘除做加法