leetcode 相交鍊錶 python實現

2021-10-01 03:51:36 字數 2633 閱讀 5137

這道題 要想解決其實不難, 開兩層迴圈進行遍歷就能實現,但是會超時

如果想要o(n) 的時間複雜度, 我考慮用雜湊表來儲存遍歷過的元素,如果發現當前遍歷的元素在雜湊表裡,那說明交叉點就在這

這裡利用了雜湊表的查詢時間是o(1)

但是這種演算法不能滿足空間複雜度是o(1)的要求

**像這樣:

1

class

solution(object):

2def

getintersectionnode(self, heada, headb):

3"""

4:type head1, head1: listnode

5:rtype: listnode

6"""7#

如果有乙個鍊錶是空的 那就沒有交叉

8if heada is none or headb is

none:

9return

none10#

計算一下兩個鍊錶的長度

11 ca =heada

12 cb =headb

13 ta, tb = 1, 1

14while ca.next is

notnone:

15 ta += 1

16 ca =ca.next

17while cb.next is

notnone:

18 tb += 1

19 cb =cb.next20#

如果最後乙個元素都不一樣說明沒有交叉

21if ca.val !=cb.val:

22return

none23#

如果兩個鍊錶長度不一樣,將長得鍊錶指標後移

24 ca =heada

25 cb =headb

26while tb >ta:

27 tb -= 1

28 cb =cb.next

29while ta >tb:

30 ta -= 1

31 ca =ca.next32#

從倒數長度相同的 短的鍊錶的開頭開始一位一位比較

33while ca is

not none and cb is

notnone:

34if ca.val ==cb.val:

35return

ca36 ca =ca.next

37 cb = cb.next

經過一段時間思考,如果要滿足空間複雜度是o(1) 那就不能開闢新空間,智慧型用指標來回移動的辦法

1 如果任何乙個鍊錶是空的說明沒有交叉

2 如果鍊錶交叉了最後乙個元素肯定相同, 如果不相同說明沒交叉

3 如果確定了有交叉,計算一下兩個鍊錶的長度,

思想是 調整到一樣長,然後按位比較 這樣一次遍歷就可以

具體這樣做: 每個鍊錶都有乙個遍歷指標, 

短的鍊錶的指標在頭部

長的鍊錶指標後移若干位,一直到 兩個鍊錶從尾巴開始數 到遍歷指標的長度是相同的

接下來就一遍遍歷 每一位都比較一下是否相等就可以

這樣沒有開闢新的空間 時間上是一遍遍歷o(n)

1

class

solution(object):

2def

getintersectionnode(self, heada, headb):

3"""

4:type head1, head1: listnode

5:rtype: listnode

6"""7#

建立乙個雜湊表,把每個第一次遍歷到的元素存進去8#

如果發現之前存過當前元素說明交叉了

9 dic ={}

10 ca =heada

11 cb =headb

12while ca is

not none or cb is

notnone:

13if ca is

notnone:

14try:15

dic[ca.val]

16return

ca17

except

:18 dic[ca.val] =true

19 ca =ca.next

20if cb is

notnone:

21try:22

dic[cb.val]

23return

cb24

except

:25 dic[cb.val] =true

26 cb =cb.next

27return none

LeetCode 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3在節點 c1 開始相交。注意 思路1 先使兩個鍊錶等長,然後一起遍歷兩個鍊錶 第乙個相等的即為所求的起始結點。definition for singly linked list.s...

Leetcode 相交鍊錶

leetcode 輸入 intersectval 2,lista 0,9,1,2,4 listb 3,2,4 skipa 3,skipb 1 輸出 reference of the node with value 2 輸入解釋 相交節點的值為 2 注意,如果兩個列表相交則不能為 0 從各自的表頭開始...

Leetcode相交鍊錶

public class listnode listnodes new hashset while heada null while headb null return null 寫點 哈哈,拿到題我想到用啥結構做呢?然後想著最近一直在用雜湊解決問題,這題用雜湊呢?可以,搞它!先把鍊錶a放到表裡,然...