解題思路一:最簡單的,就是把兩組組合成數字,再運用相加相加,再分拆各個數位上的數字。但這樣做耗時太大
解題思路二:
先把兩個數字個位數拿出來(例如題中的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呢?那我們就需要先對鏈表進行逆序操作。具體的逆序操作如下圖:
圖中逆序鏈表的頭節點是不動的,新的節點不是從鏈表尾部插入,而是從頭節點head的後面插入。如一條鏈表的順序爲8-5-1,則逆序時,它依次進入新鏈表的順序也是8-5-1,所以新鏈表從頭節點開始讀就是1-5-8了。
代碼:
def reverseList(l:ListNode):
new = ListNode(0)
while l!=None:
val = ListNode(l.val)
val.next = new.next
new.next = val
l = l.next
return new.next