Add_Two_Numbers python 求解

weixin_34138377發表於2018-03-12

leetcode 傳送門
例子:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

大體意思就是從前向後做加法,逢十進一。
在評論區找到的一個程式碼:

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        carry = 0    # 進位符
        root = n = ListNode(0)
        while l1 or l2 or carry:
        # 只要 l1 l2 都不為空才進行操作,否則直接返回 0
            v1 = v2 = 0
            if l1:
                v1 = l1.val
                l1 = l1.next
            if l2:
                v2 = l2.val
                l2 = l2.next
            carry, val = divmod(v1+v2+carry, 10)
            n.next = ListNode(val)
            n = n.next
        return root.next    # 這步一定要仔細理解

divmod() 函式返回的是商和餘數構成的元組。
例如 a, b = divmod(6, 3) 就是 6除以3, a = 2, b = 0

這道題涉及到連結串列的知識,我想用 C 解答起來會稍微容易理解一點。對於 python,主要的是理解連結串列的構造。

 class ListNode(object):
     def __init__(self, x):
         self.val = x
         self.next = None

使用這個類來構造一個連結串列

idx = ListNode(3)
n = idx
n.next = ListNode(4)
n = n.next
n.next = ListNode(5)
n = n.next
print(idx.val,idx.next.val,idx.next.next.val)
9265158-44162336e7d4c807.png
測試.png

其實感覺 python 做這種資料結構對於理解連結串列來說還是有幫助的,但是相較於 C 程式碼, python 的程式碼還是難以理解的。

相關文章