1. 程式人生 > >劍指offer:連結串列中環的入口結點(Python)

劍指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

相關推薦

offer連結串列中環入口結點

題目描述 給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。 很經典的一道題目,用快慢兩個節點遍歷連結串列,一個一次走一步,一個一次走兩步,直到兩個結點相遇,此時: 快結點走的步數是慢節點的兩倍,s(slow)=a s(fast)=2a

offer連結串列中環入口結點Python

題目描述 一個連結串列中包含環,請找出該連結串列的環的入口結點。 解題思路 思路1: 用慣了字典,立即想到用字典儲存每個節點。當某個節點出現的次數為2時返回該節點。 def EntryNodeOfLoop(self, pHead): dic

offer陣列中的重複數字python

題目描述在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。#

offer二叉樹的深度Python

題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 解題思路 兩種解法,一種是第一時間的思路,即獲得根節點到每個葉節點的深度,取其中最長的返回: class Soluti

offer二叉樹的映象Python

問題描述 操作給定的二叉樹,將其變換為源二叉樹的映象。 思路描述 程式碼比文字更直觀 文字描述:新建一個二叉樹,利用遞迴法,將源二叉樹上的左節點賦值到新二叉樹的右節點,將源二叉樹上的右節點賦值到新二叉樹的左節點。 Python程式碼

offer 55. 連結串列中環入口結點

題目描述 給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。 思路: z這種題直接引入Python list進行遍歷儲存,簡直不能再省心。 參考答案: # -*- coding:utf-8 -*- # class ListNode: #

offer連結串列中環入口Java實現

連結串列中環的入口 NowCoder 題目描述: 給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。 ###解題思路: 第一步,找環中相匯點。分別用p1,p2指向連結串列頭部,p1每次走一步,p2每次走二步,直到p1==p2找到在環中的

[Offer] 23_連結串列中環入口節點

題目 如果一個連結串列中包含環,如何找出環的入口節點? 例: 1->2->3->4->5->6     個__________| 思路 快慢指標相遇時找到環,並算出環長度,然後用一組間隔環長

offer連結串列中環入口結點

時間限制:1秒 空間限制:32768K 熱度指數:32723 本題知識點: 連結串列 題目描述 一個連結串列中包含環,請找出該連結串列的環的入口結點。 思路:兩個指標,p1在後,p2在前,

offer對稱的二叉樹java

/** * 題目: * 請實現一個函式,用來判斷一顆二叉樹是不是對稱的。 * 注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。 * */ public class P159_IsSymmerical { boolean

offer————在二維數中查詢python

題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 def f(a,n): c,r = len(a)-1,len

offer之最小的K個數Python

題目描述 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 這個題目完成的思路有很多,很多排序演算法都可以完成既定操作,關鍵是複雜度性的考慮。以下幾種思路當是筆者拋磚引玉,如果讀者有興趣

[offer]找到連結串列環的入口節點java

 //基於hash索引 public ListNode EntryNodeOfLoop1(ListNode pHead) { ListNode next = pHead; Set<ListNode> s

offer鏈表中環入口節點

self. 就是 使用 nod 包含 因此 相同 github 同步 題目描述給一個鏈表,若其中包含環,請找出該鏈表的環的入口節點,否則,輸出null。 # -*- coding: utf-8 -*- # @Time : 2019-04-23 22:40 #

[offer] --14.連結串列中倒數第k個結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = v

offer練習-連結串列

由於最近太忙,幾個連結串列的題目都寫在了一個解決方案裡了,程式碼可能有點亂,以下先提交程式碼,思路都在註釋裡,後期有時間了再整理筆記   1 // printListFromTailToHead.cpp: 定義控制檯應用程式的入口點。 2 // 3 4 #incl

offer--關於連結串列操作的演算法

題1:輸入一個連結串列,輸出該連結串列中倒數第k個結點。 思路1: 因為我們拿到的是第一個結點,不知道最後一個結點在哪。但是我們可以發現,從第一個結點走到倒數第K個結點的長度和正著第k個結點到最後一個結點的長度一樣。所以我們可以用兩個指標指向第一個結點,讓第一個指證先走k-1步,然後兩個指證

offer連結串列中第k個結點

帶測試函式 package demo2; class Node { int data; Node next=null; public Node(int data) { this.data = data; } } package demo

Offer14連結串列中倒數第k個結點

思路:  先判斷k是否小於1,若是則什麼都不返回。 反之,將head.val的值依次加入到列表l中,然後在判斷k是否大於l的長度,若是則什麼都不返回,反之返回l[-k]。 # -*- coding:utf-8 -*- # class ListNode: # def __

Offer - 複雜連結串列的複製(Java語言實現)

題目描述 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空) 思路分析: 方法1,藉助Hash