1. 程式人生 > >Leetcode 2. Add Two Numbers 兩數相加

Leetcode 2. Add Two Numbers 兩數相加

Leetcode 2. Add Two Numbers 兩數相加

標籤: Leetcode


題目地址:https://leetcode-cn.com/problems/add-two-numbers/

題目描述

給出兩個非空的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存一位數字。

如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

演算法描述

這道題比較簡單,其實就是考察了單鏈表的遍歷,然後遍歷的時候相加,然後記得有一個進位,關鍵就是細節的處理,比如進位的操作,如果最後都遍歷完要記得處理進位,以及當一個表遍歷結束後記得怎麼處理或者初始的時候一個表就是空表該怎麼處理。所以思想就是遍歷一遍,然後把對應位置的元素相加並且加上進位的元素,再對10進行整除以及取餘,整除作為下一次的進位,餘數作為當前位置的加的輸出。

對比答案得出的兩個細節問題:

  1. 在儲存結果的時候,我存在res中我做的是不帶頭結點的連結串列,這樣的話插入操作會分第一個結點或者是其他結點,所以比較麻煩,但是答案用的是帶頭結點的做插入操作,然後最後返回了一個res.next即可。
  2. 在進行處理的時候我是在兩個表一個為空的時候再單獨處理另外一個,但是答案是在一個表為空的時候把那個取出的值變為0,這樣可以統一操作,使得程式碼更加簡潔。

python程式碼

# 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
        """
        p = l1
        q = l2
        res = ListNode(0)
        r = res
        s = 0 # 進位
        # 當然也可以做成帶頭結點返回為res.next即可
        while(p!=None or q!=None):
            p_v = 0 if p==None else p.val
            q_v = 0 if q==None else q.val
            r_v = (p_v+q_v+s)%10
            s = (p_v+q_v+s)//10
            r.next = ListNode(r_v)
            r = r.next
            r.next = None
            # 如果不為None的時候繼續遍歷,否則停止遍歷
            p =p if p==None else p.next
            q =q if q==None else q.next
        if s !=0:
            r.next = ListNode(s)
            r = r.next
            r.next = None
        return res.next
l1 = ListNode(0)
l2 = ListNode(1)
l2.next = ListNode(8)      
s = Solution()
print(s.addTwoNumbers(l1, l2))