思路:
鍊錶的長度不一定相同,如果出現了某乙個公共結點,那麼這個公共結點之後倘若還有結點,那麼後面的結點肯定相同,因為只是單鏈表,next相同。
第一種比較簡單的做法是,兩個鍊錶l1、l2連起來,乙個在前乙個在後。就有l1-l2,l2-l1兩個復合鍊錶。由於此時長度相同了,倘若有相同的結點,從公共結點開始肯定一樣。
class
solution
:
def findfirstcommonnode
(self, phead1, phead2)
: p = phead1
q = phead2
while p != q :
p = p.next if p != none else phead2
q = q.next if q != none else phead1
return p
也可先走過超出的結點數,再一起走:易理解!
class
solution
(object):
defgetintersectionnode
(self, heada, headb)
: counta =
0 countb =0if
not heada:
return
none
ifnot headb:
return
none
head1 = heada
head2 = headb
while head1.
next
: head1 = head1.
next
counta +=
1while head2.
next
: head2 = head2.
next
countb +=
1 dif =
abs(counta - countb)
# 算出之間的相差數
head1 = heada
head2 = headb
if counta > countb:
for i in
range
(dif)
: head1 = head1.
next
else
:for i in
range
(dif)
: head2 = head2.
next
while head1 != head2 and head1 !=
none
: head1 = head1.
next
head2 = head2.
next
return head1
第二種做法是牛客網也通過了,但是我覺得不太對。通過先把第乙個鍊錶裡面的每乙個結點的val儲存在陣列l1中,然後依次將第二個煉表裡的結點的val與陣列比較,如果有相同的,說明就是公共結點。 並且時間複雜度四o(n*n)。
class
solution
: def findfirstcommonnode
(self, phead1, phead2)
:# write code here
list1 =
list2 =
node1 = phead1
node2 = phead2
while node1:
list1.
(node1.val)
node1 = node1.next
while node2:
if node2.val in list1:
return node2
else
: node2 = node2.next
但是,我個人覺得可能有多個結點裡的val相同,所以如果這樣就不對了。如果是我理解不對,歡迎指正。
第三種方法可能比較麻煩,是我自己想的。就是先通過鍊錶反轉,依次進行比較,若有公共結點,最後乙個公共結點就是原來鍊錶的第乙個結點。之所以原來的鍊錶不能直接比較是因為兩個鍊錶的長度不一定相同,所以依次取next不可行。
兩個鍊錶的第乙個公共結點
思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...
兩個鍊錶的第乙個公共結點
題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...
兩個鍊錶的第乙個公共結點
輸入兩個鍊錶,找出它們的第乙個公共結點。分析 如果兩個單向鍊錶有公共的結點,那麼這兩個鍊錶從某乙個結點開始,他們的next結點都指向同乙個結點,但由於是單向鍊錶的結點,每個結點都只有乙個next結點,因此從第乙個公共結點開始,之後他們所有結點都是重合的,不可能出現分支。public listnode...