#思路1:先順序遍歷第乙個鍊錶的結點,每遍歷到乙個結點時候,在第二個鍊錶上順序遍歷每個結點。如果在第二個鍊錶上有和第乙個鍊錶相同的結點,則找到了公共結點。複雜度o(mn)
#思路2:使用輔助棧,分別把兩個鍊錶放入到兩個棧中,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,在比較棧頂元素是否相同。如果相同則彈出棧頂元素,接著比較下乙個棧頂,直到找到最後乙個相同的結點。定義了輔助棧用空間來換取時間。複雜度o(m+n)
class
listnode
(object):
def__init__
(self,x)
: self.val=x
self.
next
=none
node1 = listnode(1)
node1.
next
= listnode(2)
node1.
next
.next
= listnode(3)
node1.
next
.next
.next
= listnode(4)
node1.
next
.next
.next
.next
= listnode(5)
node2 = listnode(8)
node2.
next
= listnode(6)
node2.
next
.next
= listnode(4)
node2.
next
.next
.next
= listnode(5)
deffindfirstcommentnode
(phead1, phead2)
: stack1 =
stack2 =
while phead1:
phead1 = phead1.
next
while phead2:
phead2 = phead2.
next
first_commentnode =
none
while stack1 and stack2 and stack1[-1
].val == stack2[-1
].val:
first_commentnode = stack1.pop(
) stack2.pop(
)return first_commentnode
# print('第乙個公共結點',findfirstcommentnode(node1,node2).val)
#思路3:先遍歷兩個鍊錶,得到鍊錶的長度以及長的鍊錶比短的鍊錶多幾個結點,接著第二次遍歷的時候,在較長的鍊錶上先走多的結點數,接著在同時遍歷兩個鍊錶,找到第乙個相同結點就是他們的公共結點。這樣不需要空間複雜度o(m+n)
defgetlistlength
(phead)
: length =
0while phead:
length+=
1 phead = phead.
next
return length
deffindfirstcommentnode2
(phead1, phead2)
: length1 = getlistlength(node1)
length2 = getlistlength(node2)
len_diff =
abs(length1-length2)
longhead = phead1
shorthead = phead2
if length1 < length2:
longhead = phead2
shorthead = phead1
#先在長鍊表上走幾步,在同時遍歷兩個鍊錶
for i in
range
(len_diff)
: longhead = longhead.
next
while shorthead and longhead and shorthead.val != longhead.val:
shorthead = shorthead.
next
longhead = longhead.
next
return shorthead
# print(findfirstcommentnode2(node1,node2).val)
兩個鍊錶的第乙個公共結點
思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...
兩個鍊錶的第乙個公共結點
題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...
兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。分析 如果兩個單向鍊錶有公共的結點,那麼這兩個鍊錶從某乙個結點開始,他們的next結點都指向同乙個結點,但由於是單向鍊錶的結點,每個結點都只有乙個next結點,因此從第乙個公共結點開始,之後他們所有結點都是重合的,不可能出現分支。public listnode...