鍊錶 876 鍊錶的中間結點 2 兩數相加

2021-10-03 18:11:55 字數 3116 閱讀 2647

示例:

示例 1:

輸入:[1,2,3,4,5]

輸出:此列表中的結點 3 (序列化形式:[3,4,5])

返回的結點值為 3 。 (測評系統對該結點序列化表述是 [3,4,5])。

注意,我們返回了乙個 listnode 型別的物件 ans,這樣:

ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = null.

示例 2:

輸入:[1,2,3,4,5,6]

輸出:此列表中的結點 4 (序列化形式:[4,5,6])

由於該列表有兩個中間結點,值分別為 3 和 4,我們返回第二個結點。

定義兩個指標和指標的位置,慢指標走一步,快指標走到慢指標的一倍

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

middlenode

(self, head: listnode)

-> listnode:

pre = head

cur = pre

cur_pos =

0 pre_pos =

0while cur.

next

: pre = pre.

next

pre_pos +=

1while cur_pos < pre_pos *

2and cur.

next

: cur = cur.

next

cur_pos +=

1return pre

定義兩個指標和指標的位置,慢指標走一步,快指標走兩步

為什麼使用while cur and cur.next的原因:

[1, 2, 3, 4, 5]

pre = 1, cur = 1

pre = 2, cur = 3

pre = 3, cur = 5

cur.next 為空,返回pre

[1, 2, 3, 4, 5, 6]

pre = 1, cur = 1

pre = 2, cur = 3

pre = 3, cur = 5

pre = 4, cur = none

cur 為空,返回pre,正好是第二個中間節點

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

middlenode

(self, head: listnode)

-> listnode:

pre = head

cur = pre

while cur and cur.

next

: pre = pre.

next

cur = cur.

next

.next

return pre

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

不斷遍歷兩個鍊錶,每次遍歷都將鍊錶a和鍊錶b的值相加,再賦給鍊錶a。如果有進製則記錄乙個進製標誌。

迴圈的條件是鍊錶a不為空或者鍊錶b不為空,這樣當整個迴圈結束時,鍊錶就被串起來了。

注意:當迴圈結束時,如果進製標誌為1還需要處理下邊界條件。

class

solution

:def

addtwonumbers

(self, l1: listnode, l2: listnode)

-> listnode:

a, b = l1, l2

# 定義主指標,指向l1,用來處理

# 1. 迴圈結束時,進製標誌為1

# 2. a,b鍊錶長度不一致

# 的情況,最終返回l1

p =none

# 定義進製標誌

carry =

0while a or b:

# 將鍊錶a,b的值相加,並加上可能的進製

val =

(a.val if a else0)

+(b.val if b else0)

+ carry

# 若val>10說明要進製,carry = 1否則為0

carry =

1if val>=

10else

0# 不論是否進製,val都取個位數的值

val = val %

10# 主指標p指向a,值為val

p, p.val = a if a else b, val

# a,b向後移動,若到都頭,迴圈結束

a, b = a.

next

if a else

none

, b.

next

if b else

none

# 判斷主指標的下乙個指向,若a,b都為空,則指向空,若a,b有乙個不為空,則指向不為空者

p.next

= a if a else b

# 處理迴圈結束時,進製標誌為1的情況

if carry:

p.next

= listnode(1)

return l1

876 鍊錶的中間結點

給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode 型別的...

876 鍊錶的中間結點

題目描述 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnod...

876 鍊錶的中間結點

給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。該題目來自力扣題庫 示例示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 ...