兩數相加

題目描述:算法

給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。將兩數相加返回一個新的鏈表。spa

你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
緣由:342 + 465 = 807 
思路:

算法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
相關文章
相關標籤/搜索