解題思路一:最簡單的,就是把兩組組合成數字,再運用相加相加,再分拆各個數字上的數字。但這樣做耗時太大
解題思路二:
先把兩個數字個位數拿出來(例如題中的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 ...