2.兩數相加-leetcode(python)
阿新 • • 發佈:2019-01-22
- 題目描述
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
- 示例
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
- 解決方案
題意為:兩個逆序儲存表示整數的連結串列相加,和也是用逆序儲存的連結串列輸出。
因此可以將兩個連結串列的同級節點正序相加,如果有進位則下一級節點的和需要加1,或者是做新增節點的操作(在最後一級節點之和大於10的情況下)
- 程式碼
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ #一開始不做l1和l2的非空判斷,因為題中已經說明是非空連結串列 #記錄是否需要增加新節點,或者在連結串列的下一個節點是否需要加1,同時記錄兩個連結串列同級節點的和 carry = 0 #這裡的執行順序是 res = ListNode(0),pre = res res = pre = ListNode(0) #判斷l1、l2、carry是否有值,carry有值的話需要增加節點,或者在連結串列下一個節點加1 while l1 or l2 or carry: if l1: carry += l1.val l1 = l1.next if l2: carry += l2.val l2 = l2.next #carry現在是同級節點的和 #divmod返回商與餘數的元組,分為carry和val #caarry不是0的話,需要新建節點或者在連結串列的下一個節點加1 ,在迴圈中用到 carry,val = divmod(carry,10) #新建連結串列節點 #執行順序是pre.next = ListNode(val) #pre = pre.next pre.next = pre = ListNode(val) #res等價於pre ,res.val = 0,所以返回res.next return res.next
- 待理解的地方
#這裡的執行順序是 res = ListNode(0),pre = res
res = pre = ListNode(0)
指標的問題,理解起來就是res = pre = ListNode(0)的話,也就是res和pre指向了同一個連結串列,而分開寫的話,pre是指向了複製的和res相同的另一個連結串列。