1.暴力求解
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
(object):
defgetintersectionnode
(self, heada, headb)
:"""
:type head1, head1: listnode
:rtype: listnode
"""if heada==
none
or headb==
none
:return
none
n1=heada
while
(n1)
: n2=headb
while
(n2):if
(n1==n2)
:return n1
n2=n2.
next
n1=n1.
next
return
none
超出了時間限制,fine
2.雙指標法
相當於n1和n2先走到各自的尾部(第一階段),然後從對方的頭部繼續(第二階段),如果這兩個鍊錶是相交的,那麼他們一定會在第二階段於交點處相遇,畫個圖能理解。
if heada==
none
or headb==
none
:return
none
n1=heada
n2=headb
while
(n1!=n2):if
(n1)
: n1=n1.
next
else
: n1=headb
if(n2)
: n2=n2.
next
else
: n2=heada
return n1
3.消除長度
先求出兩個鍊錶的長度,然後從頭開始,先是長的那個鍊錶從頭部向後走,短的還是在頭部,直到它們剩下的長度相同,這個時候就一起開始走,如果兩個鍊錶相交,那麼他們一定會同時到達交點處。
if heada==
none
or headb==
none
:return
none
n1=heada
n2=headb
if(n1==n2)
:return n1
length1=
0 length2=
0while
(n1)
: length1+=
1 n1=n1.
next
while
(n2)
: length2+=
1 n2=n2.
next
n1=heada
n2=headb
while
(length1>length2)
: n1=n1.
next
length1-=
1while
(length1: n2=n2.
next
length2-=
1while
(n1 and n2):if
(n1==n2)
:return n1
n1=n1.
next
n2=n2.
next
4.集合
把a或b的指標全部放在乙個集合,遍歷另外乙個鍊錶,如果某個指標在集合中,那麼他們從這個指標之後就是相交的。
if heada==
none
or headb==
none
:return
none
n1=heada
n2=headb
if(n1==n2)
:return n1
set1=
set(
)while
(n1)
: set1.add(n1)
n1=n1.
next
while
(n2):if
(n2 in set1)
:return n2
n2=n2.
next
關於python的集合操作,在 面試題02 07 鍊錶相交
題目大概練過leetcode的鍊錶部分估計都做過這道題 示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3輸出 reference of the node with value 8輸入解釋 相交節點的值為 ...
面試題 02 07 鍊錶相交
題目鏈結 給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 list...
leetcode 面試題 02 07 鍊錶相交
面試題 02.07.鍊錶相交 給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。示例 1 輸入 intersectval 8,lista 4,1,...