題目描述
輸入兩個鍊錶,找出它們的第乙個公共結點。
解題思路
思路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都指向同乙個結點,及公共結點一定出現在鍊錶的 尾部。兩種思路 第一種是將兩個鍊錶的結點放入棧中,我們依次比較棧頂元素,找出公共結點出現的最後乙個元素。第二種是將...