鍊錶中環的入口結點 題解

2021-09-24 13:31:08 字數 1465 閱讀 1202

#-*- coding:utf-8 -*-

'''@project: exuding-nlp-all

@author: tao

@time: 2019-06-18 14:58:59

'''#給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

#方法一

'''第一步 找環中相匯點。分別用p1,p2指向鍊錶頭部.

p1每次走一步,p2每次走二步,直到p1==p2找到在環中的相匯點。

第二步 找環的入口。

接上步,當p1==p2時,p2所經過節點數為2x,p1所經過節點數為x.

設環中有n個節點,p2比p1多走一圈有2x=n+x; n=x; ??不一定多走一圈??

可以看出p1實際走了乙個環的步數,再讓p2指向鍊錶頭部.

p1位置不變,p1,p2每次走一步直到p1==p2; 此時p1指向環的入口。

'''class solution:

def entrynodeofloop(self, phead):

# write code here

slow,fast=phead,phead

while fast and fast.next:

slow=slow.next

fast=fast.next.next

if slow==fast:

slow2=phead

while slow!=slow2:

slow=slow.next

slow2=slow2.next

return slow

#方法二

'''時間複雜度為o(n),兩個指標,乙個在前面,另乙個緊鄰著這個指標,在後面。

兩個指標同時向前移動,每移動一次,前面的指標的next指向null。

也就是迴圈的第乙個。

這時候已經是第二次訪問迴圈的第一節點了,第一次訪問的時候我們已經讓它指向了null,

所以到這結束。

*****但是破壞了鍊錶,並且沒有環的鍊錶需要判斷

'''#方法三 運用資料結構儲存的時候一些物件儲存解決

## class solution:

# def entrynodeofloop(self, phead):

# stack =

# while phead:

# phead = phead.next

# if phead in stack:

# return phead

# return

劍指offer55 鍊錶中環的入口結點 題解

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。演算法流程 雙指標第一次相遇 設兩指標 pslow pfast 指向鍊錶頭部 phead pfast 每輪走 1 步,pslow 每輪走 1 步 第一種結果 pfast 走過鍊錶末端,說明鍊錶無環,直接返回 null 第二種結...

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...