剑指offer23:链表中环的入口结点

题目描述

一个链表中包含环,请找出该链表的环的入口结点。

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
         self.val = x
         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        meet_node=self.MeetNode(pHead)
        if meet_node == None:
            return None
        loop_node=1
        p1=meet_node
        while p1.next!=meet_node:
            loop_node += 1
            p1=p1.next
        p1=pHead
        for i in range(loop_node):
            p1=p1.next
        p2=pHead
        while p1!=p2:
            p1=p1.next
            p2=p2.next
        return p1
    def MeetNode(self,pHead):
        if pHead==None:
            return None
        slow=pHead.next
        if slow==None:
            return None
        fast=slow.next
        while fast!=None and slow!=None:
            if slow==fast:
                return slow
            slow=slow.next
            fast=fast.next
            if slow!=fast:
                fast=fast.next
        return None

按照书上的方法完成,相当于重写了c++代码。利用两个指针,先找到环内节点,在找到环的长度,最后找到环的入口。

链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网

解法:
第一步,先找到环中的一个节点(找到之后就可以计算出环中的节点数目)
    让一个指针fast走快一点,一个指针slow走慢一点;当fast与slow相遇时,即fast比slow多一圈,此时相遇的节点肯定是环内的节点
第二步,根据环中的节点来计算环中节点总数
    从此节点遍历到此节点结束,即可得到节点总数
第三步,知道了环内节点总数,来找到环入口
    先让一个指针p1从根节点开始往后走m步,然后再让一个节点p2指向头结点;
    然后让p1和p2同时往后移动,当p1与p2相交时,此时的点就是环的入口节点



猜你喜欢

转载自blog.csdn.net/zhangjiaxuu/article/details/80910944