這道題目是要找到兩個鍊錶相交的起始節點,題目如下所示:
這裡有乙個很巧妙的解法,我們來從這兩個鍊錶的結構來分析,我們如何去找到兩個鍊錶相交的起始節點呢?相交之後的鍊錶是一樣的,我們看下圖所示:
在圖中 a
aa 點和 b
bb 點分別表示兩個鍊錶的起點,c
cc 點事我們要找的交點,acac
ac的長度是 a
aa,bcbc
bc的長度是 b
bb ,剩下相同部分的內容長度是 c
cc,那麼我們可以用兩個指標分別從 a
aa 和 b
bb 出發,到鍊錶結束的時候將指標指向另外乙個鍊錶的起始點,也就是說兩個指標的執行軌跡分別是:a→c
→d→b
→ca \to c \to d \to b \to c
a→c→d→
b→c 和 b→c
→d→a
→cb \to c \to d \to a \to c
b→c→d→
a→c,每個指標所走的長度分別是:a+c
+ba+c+b
a+c+
b 和 b+c
+ab+c+a
b+c+
a,因為 a+c
+b=b
+c+a
a+c+b=b+c+a
a+c+b=
b+c+
a,所以說兩個指標分別從 a
aa 和 b
bb 兩個點出發,到尾部指向另乙個鍊錶的頭,最終兩個指標會在c點相遇,這麼一來我們就可以找到兩個鍊錶相交的地方,如下是**:
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def getintersectionnode(self, heada, headb):
""":type head1, head1: listnode
:rtype: listnode
"""if not heada or not headb:
return
p = heada
q = headb
while p is not q:
p = p.next if p else headb
q = q.next if q else heada
return p
我們用指標走的距離和相等的特性來作為找相交節點的突破口是乙個比較巧妙的辦法,希望對大家理解鍊錶有所幫助,謝謝。 LeetCode160 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅用 o 1 記憶體。解題思路 1.找到兩個鍊錶長度差n後...
Leetcode160 相交鍊錶
解法一 用乙個集合去判斷 class solution sets listnode tmp1 heada listnode tmp2 headb while tmp1 while tmp2 tmp2 tmp2 next return nullptr 解法二 先遍歷一遍兩個鍊錶得到的長度差n,然後讓長...
LeetCode 160 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅...