?題目描述
給出兩個非空的鏈表用來表示兩個非負的整數,其中,它們各自的位數是按照 逆序的方式存盤的,并且它們的每個節點只能存盤一位數字,如果,我們將這兩個數相加起來,則會回傳一個新的鏈表來表示它們的和,您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭,
1 示例: 2 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 3 輸出:7 -> 0 -> 8 4 原因:342 + 465 = 807
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
題目決議
本題是將兩個鏈表形式的數字相加,計算結果也同樣用鏈表來表示,鏈表在python中可以用類來描述,題中已經給出,其中包含資料域和指標域,關于鏈表在python中的實作我會再寫一篇文章來闡述,對于本題來說資料在鏈表中的存盤按逆序排列,也就是說鏈表的第一個節點就是數字的個位,依次為十位、百位等,兩數相加完全可以按照小學列豎式加法來計算,也就是個位相加,向十位進位,以此類推,
需要注意的一點是,兩個數字的位數不一定相等,那么可以先將存在的對應位相加,多出來的數位直接與進位相加即為結果,看程式會更容易理解一些,
1 # Definition for singly-linked list. 2 class ListNode: 3 def __init__(self, x): 4 self.val = x 5 self.next = None 6 ? 7 class Solution: 8 def addTwoNumbers(self, l1, l2): 9 """ 10 :type l1: ListNode 11 :type l2: ListNode 12 :rtype: ListNode 13 """ 14 p = start = ListNode(-1) 15 carry = 0 16 while l1 and l2: 17 p.next = ListNode(l1.val + l2.val + carry) 18 carry = p.next.val // 10 19 p.next.val %= 10 20 p = p.next 21 l1 = l1.next 22 l2 = l2.next 23 res = l1 or l2 24 while res: 25 p.next = ListNode(res.val + carry) 26 carry = p.next.val // 10 27 p.next.val %= 10 28 p = p.next 29 res = res.next 30 if carry: 31 p.next = ListNode(carry) 32 return start.next
總體來說程序中主要分兩部分,第一部分是對應位相加,再加上進位值(默認為0,即計算個位時),對10取余得到對應位的數字,賦值給新鏈表,對10取整得到進位值,賦值給carry;第二部分是判斷出其中一個數字已經遍歷完,那么用剩下數字與進位相加,賦值給新鏈表,
執行結果顯示用時較長,記憶體消耗較小,有新的方法可以一起來討論哈!
掃描二維碼
獲取更多精彩
小田學Python
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195330.html
標籤:Python
