劍指37 兩個鍊錶的第乙個公共結點

2021-09-29 17:34:16 字數 2106 閱讀 4038

題目描述

輸入兩個鍊錶,找出它們的第乙個公共結點。

解題思路

思路1:

如果兩個鍊錶存在公共結點,那麼它們從公共結點開始一直到鍊錶的結尾都是一樣的,因此我們只需要從鍊錶的結尾開始,往前搜尋,找到最後乙個相同的結點即可。但是題目給出的單向鍊錶,我們只能從前向後搜尋,這時,我們就可以借助棧來完成。先把兩個鍊錶依次裝到兩個棧中,然後比較兩個棧的棧頂結點是否相同,如果相同則出棧,如果不同,那最後相同的結點就是我們要的返回值。

思路2:

還有一種方法,不需要借助棧。先找出2個鍊錶的長度,然後讓長的先走兩個鍊錶的長度差,然後再一起走,直到找到第乙個公共結點。

python**:

思路1 **:

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

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

findfirstcommonnode

(self, phead1, phead2)

: stack1 =

stack2 =

while phead1:

phead1 = phead1.

next

while phead2:

phead2 = phead2.

next

pre =

none

while stack1 and stack2 and stack1[-1

]== stack2[-1

]:pre = stack1.pop(

) stack2.pop(

)return pre

思路2 **:

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

findfirstcommonnode

(self, phead1, phead2)

: length1 = self.getlistlength(phead1)

length2 = self.getlistlength(phead2)

lendif = length1-length2

pheadlong = phead1

pheadshort = phead2

if length2 > length1:

pheadlong = phead2

pheadshort = phead1

lendif = length2-length1

for i in

range

(lendif)

: pheadlong = pheadlong.

next

while pheadlong and pheadshort and pheadlong != pheadshort:

pheadlong = pheadlong.

next

pheadshort = pheadshort.

next

pfirstcommonnode = pheadlong

return pfirstcommonnode

defgetlistlength

(self, phead)

: length =

0 pnode = phead

while pnode:

pnode = pnode.

next

length +=

1return length

劍指offer 37兩個鍊錶的第乙個公共結點

package listtest.listintersection 查詢兩個鍊錶的第乙個交點 兩個有交點的鍊錶自交點結點開始到最後乙個結點都是相同的。如果能從最後乙個結點遍歷到最後乙個相同的結點則為交點。但是單鏈表只能從頭結點開始遍歷,所以我們要考慮兩個鍊錶的長度是不是一樣的。如果乙個鍊錶比另外乙個...

劍指offer打卡 兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的 公共結點是啥 並不是兩個節點的值相同就是公共節點,而是在第一鍊錶和第二鍊錶中都存在乙個節點,該節點往後的子鍊錶在兩個鍊錶中是相同的。如下圖中的6就是第乙個公共結點。設 a ...

劍指offer37題(兩個鍊錶的第乙個公共結點)

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 首先要明白一點 如果兩個單向鍊錶有公共結點,那麼這兩個鍊錶從某一結點開始,它們的next都指向同乙個結點,及公共結點一定出現在鍊錶的 尾部。兩種思路 第一種是將兩個鍊錶的結點放入棧中,我們依次比較棧頂元素,找出公共結點出現的最後乙個元素。第二種是將...