剑指offer:链表中环的入口结点(Python)

题目描述

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

解题思路

思路1:

用惯了字典,立即想到用字典存储每个节点。当某个节点出现的次数为2时返回该节点。

def EntryNodeOfLoop(self, pHead):
    dict = {}
    dict[pHead] = 1
    while dict[pHead] != 2 and pHead.next:
        pHead = pHead.next
        if pHead not in dict:
            dict[pHead] = 1
        else:
            return pHead
    return None

缺点:空间复杂度O(N)

思路2:

取自牛客
1. 分别用oneStep,twoStep指向链表头部,oneStep每次走一步,twoStep每次走二步,直到oneStep==twoStep找到二者在环中的相汇点。
2. 当oneStep==twoStep时,twoStep所经过节点数为2x,oneStep所经过节点数为x,设闭环中有n个节点,twoStep比oneStep多走k圈有2x=kn+x; nk=x;简单起见,可以看作k=1,oneStep实际走了一个环的步数,再让twoStep指向链表头部,oneStep位置不变,oneStep,twoStep每次走一步直到oneStep==twoStep; 此时oneStep指向环的入口。

def EntryNodeOfLoop(self, pHead):
    if pHead == None or pHead.next == None:
        return None
    oneStep = pHead
    twoStep = pHead
    while twoStep and twoStep.next:
        oneStep = oneStep.next
        twoStep = twoStep.next.next
        if oneStep == twoStep:
            oneStep = pHead
            while oneStep != twoStep:
                oneStep = oneStep.next
                twoStep = twoStep.next
            return oneStep
    return None

猜你喜欢

转载自blog.csdn.net/u010005281/article/details/80232634