題目描述:算法
給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。將兩數相加返回一個新的鏈表。spa
算法3d
就像你在紙上計算兩個數字的和那樣,咱們首先從最低有效位也就是列表 l1l1 和 l2l2 的表頭開始相加。因爲每位數字都應當處於 0 \ldots 90…9 的範圍內,咱們計算兩個數字的和時可能會出現「溢出」。code
例如,5 + 7 = 125+7=12。在這種狀況下,咱們會將當前位的數值設置爲 22,並將進位 carry = 1carry=1 帶入下一次迭代。進位 carrycarry 一定是 00 或 11,這是由於兩個數字相加(考慮到進位)可能出現的最大和爲 9 + 9 + 1 = 199+9+1=19。blog
僞代碼以下:it
將當前結點初始化爲返回列表的啞結點。
將進位 carrycarry 初始化爲 00。
將 pp 和 qq 分別初始化爲列表 l1l1 和 l2l2 的頭部。
遍歷列表 l1l1 和 l2l2 直至到達它們的尾端。
將 xx 設爲結點 pp 的值。若是 pp 已經到達 l1l1 的末尾,則將其值設置爲 00。
將 yy 設爲結點 qq 的值。若是 qq 已經到達 l2l2 的末尾,則將其值設置爲 00。
設定 sum = x + y + carrysum=x+y+carry。
更新進位的值,carry = sum / 10carry=sum/10。
建立一個數值爲 (sum \bmod 10)(summod10) 的新結點,並將其設置爲當前結點的下一個結點,而後將當前結點前進到下一個結點。
同時,將 pp 和 qq 前進到下一個結點。
檢查 carry = 1carry=1 是否成立,若是成立,則向返回列表追加一個含有數字 11 的新結點。
返回啞結點的下一個結點。
請注意,咱們使用啞結點來簡化代碼。若是沒有啞結點,則必須編寫額外的條件語句來初始化表頭的值。io
請特別注意如下狀況:class
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ dummyHead=ListNode(0) p=l1 q=l2 curr=dummyHead carry=0 while p!=None or q!=None: x=p.val if p!=None else 0 y=q.val if q!=None else 0 sum=carry+x+y carry=sum//10 curr.next=ListNode(sum%10) curr=curr.next if p!=None: p=p.next if q!=None: q=q.next if carry>0: curr.next=ListNode(carry) return dummyHead.next