55. 链表中环的入口结点
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
记录
快慢指针
慢:一次走一步
快:一次走两步
第一次相遇:
- 慢:头指针到入口节点的长度 + x
- 快:头指针到入口节点的长度 + 环的总长度 + x
环的总长度 = 头指针到入口节点的长度 + x
头指针到入口节点的长度 = 环的总长度 - x = 慢指针一步一步走过的环剩下的长度
# -*- 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 == None or pHead.next == None or pHead.next.next == None:
return None
slow = pHead.next
fast = pHead.next.next
#第一次相遇,快指针多走了一个环的长度
while slow != fast:
if fast.next == None or fast.next.next == None:
return None
slow = slow.next
fast = fast.next.next
#快指针从头节点重新开始走
fast = pHead
#快指针一步步走
#头指针到入口节点的长度 = 环的总长度 - x = 慢指针一步一步走过的环剩下的长度
while slow != fast:
slow = slow.next
fast = fast.next
return fast