leetcode題 鍊錶中的兩數相加

2021-10-01 10:51:17 字數 2048 閱讀 9516

解題思路一:最簡單的,就是把兩組組合成數字,再運用相加相加,再分拆各個數字上的數字。但這樣做耗時太大

解題思路二:

先把兩個數字個位數拿出來(例如題中的2和5),判斷有沒有進製(即是否大於9),若有進製,則carry=進製數 否則為0。然後當兩個數字的十位上的數字相加時,還得把carry加上,再判斷是否有進製。

(做加數問題一定要注意:整除操作和求餘操作,與10整除能判斷是否存在進製,與10求餘操作能獲得該數字上的數字):

如18+34: 4+8 =12, 12/10 = 1,所以進製carry為1,12%10 = 2,所以個位數上的數字為2 。然後是十位1+3:1+3+carry=5,5/10=0,進製為0就是沒有進製,然後5%10 = 5,所以十位上的數字為5,所以18+34 = 52

**:

class listnode:

def __init__(self, x):

self.val = x

self.next = none

class solution:

def addtwonumbers(self, l1, l2):

prenode = listnode(0)

lastnode = prenode

carry = 0 #進製一開始為沒有進製

while carry or l1 or l2:

carry, val = divmod(carry + (l1.val if l1 else 0) + (l2.val if l2 else 0), 10) #找出進製和各個數字上的數字

lastnode.next = listnode(val)

lastnode = lastnode.next

l1 = l1.next if l1 else none

l2 = l2.next if l2 else none

return prenode.next

def generatelist(l: list):

prenode = listnode(0)

lastnode = prenode

for val in l:

lastnode.next = listnode(val)

lastnode = lastnode.next

return prenode.next

def printlist(l: listnode):

while l:

print("%d, " % (l.val), end='')

l = l.next

print('')

if __name__ == "__main__":

l1 = generatelist([1, 5, 8])

l2 = generatelist([9, 1, 2, 9])

printlist(l1)

printlist(l2)

s = solution()

sum = s.addtwonumbers(l1, l2)

printlist(sum)

拓展:上提是鍊錶中的數字是逆序的,就是500的話,鍊錶中的數字放置是0-0-5,這樣就方便我們從個位開始計算。但是如果500在鍊錶的放置方式是5-0-0呢?那我們就需要先對鍊錶進行逆序操作。具體的逆序操作如下圖:

leetcode 鍊錶 兩數相加(水題)

兩數相加 給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7...

leetcode演算法題 鍊錶 兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。package com.leetcode.鍊錶 author markuszhang vm args date create in 2020 2 2 15 23 public cl...

LeetCode刷題之鍊錶兩數相加

題目描述 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 ...