lintcode練習 380 兩個鍊錶的交叉

2021-08-24 17:58:15 字數 1544 閱讀 6079

請寫乙個程式,找到兩個單鏈表最開始的交叉節點。

下列兩個鍊錶:

a:          a1 → a2

↘c1 → c2 → c3

b: b1 → b2 → b3

在節點 c1 開始交叉。

需滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。

#第一步:得到a,b的長度,和a,b的最後乙個節點enda, endb

#第二步:對enda,endb進行判斷,如果enda不等於endb,則兩個鍊錶沒有相交的部分,否則對lena和lenb進行判斷,對長的鍊錶移動|lena-lenb|

#第三步:兩個長度相等的鍊錶一起走,當兩個鍊錶第一次相遇時,就到了最開始的交叉點  

"""

definition for singly-linked list.

class listnode:

def __init__(self, x):

self.val = x

self.next = none

"""class solution:

"""@param: heada: the first list

@param: headb: the second list

@return: a listnode

"""def getintersectionnode(self, heada, headb):

# write your code here

if heada is none or headb is none:

return none

cura, curb = heada, headb

#第一步:得到a,b的長度,和a,b的最後乙個節點enda, endb

lena, lenb = 1, 1

while cura.next:

lena += 1

cura = cura.next

while curb.next:

lenb += 1

curb = curb.next

#第二步:對enda,endb進行判斷,如果enda不等於endb,則兩個鍊錶沒有相交的部分,否則對lena和lenb進行判斷,對長的鍊錶移動|lena-lenb|

if cura != curb:

return none

cura, curb = heada, headb

if lena-lenb > 0:

for i in range(lena-lenb):

cura = cura.next

else:

for i in range(lenb-lena):

curb = curb.next

#第三步:兩個長度相等的鍊錶一起走,當兩個鍊錶第一次相遇時,就到了最開始的交叉點

while cura != curb:

cura = cura.next

curb = curb.next

return cura

LintCode 380 兩個鍊錶的交叉

請寫乙個程式,找到兩個單鏈表最開始的交叉節點。注意事項 樣例 下列兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3在節點 c1 開始交叉。思路 1.鍊錶1從頭節點開始,走到最後乙個節點 不是結束 統計鍊錶1的長度記為len1,同時一記錄鍊錶1的最後乙個節點記為cura 2.鍊錶2從頭...

lintcode 380 兩個鍊錶的交叉

請寫乙個程式,找到兩個單鏈表最開始的交叉節點。樣例 樣例 1 輸入 a a1 a2 c1 c2 c3 b b1 b2 b3 輸出 c1 解釋 在節點 c1 開始交叉。樣例 2 輸入 intersected at 61 2 3 4 5 6 7 8 9 10 11 12 13 null6 7 8 9 1...

兩個整數相除 LintCode

將兩個整數相除,要求不使用乘法 除法和 mod 運算子。樣例 給定被除數 100 除數 9,返回 11。思想 利用位操作來擴大除數的值,被除數不斷減去除數,直至被除數小於除數。ifndef c414 h define c414 h include using namespace std class ...