55.链表中环的入口
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口节点,否则,输出null。
解题思路
有如下这么一个包含环的链表
从图中我们可以知道环中有四个节点,我们设置两个指针,第一个指针不动,第二个指针先走4步
这个位置开始P1,P2同时开始循环,他们第一次相遇的地方就是环的入口。
那么如何获取环的长度呢?
我们同样设置两个指针,从头结点出发,一个快指针每次走两个节点,一个慢指针每次走一个节点,他们会在环中相遇。然后一个不动,另一个继续循环,并且计数n,当再次遇到另一个指针的时候,此时的n即是环的长度
Python代码如下
# -*- 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:
return None
meetingnode = self.MeetingNode(pHead)
if meetingnode == None:
return None
nodeslop = 1
node1 = meetingnode
while node1.next != meetingnode:
node1 = node1.next
nodeslop += 1
node1 = pHead
for _ in range(nodeslop):
node1 = node1.next
node2 = pHead
while node1 != node2:
node1 = node1.next
node2 = node2.next
return node1
def MeetingNode(self, pHead):
slow = pHead.next
if slow == None:
return None
fast = slow.next
while fast != None and slow != None:
if slow == fast:
return fast
slow = slow.next
fast = fast.next
if fast != None:
fast = fast.next
return None