LeetCode兩數相加
阿新 • • 發佈:2020-09-11
題目描述:
給出兩個非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。
如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
第一次嘗試:
將儲存在連結串列中的數字轉換為int型別的數字,然後將兩個數字相加的加過在按位存貯在連結串列中返回。
注意點:因為儲存在連結串列中的數字可能非常大,那麼在將連結串列中的數字轉換成int型別的時候會超出int型別能夠儲存的範圍,那麼結果就會出錯。
1 # class ListNode: 2 # def __init__(self, x): 3 # self.val = x 4 # self.next = None 5 6 class Solution: 7 def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: 8 a = l1.val 9 i = 1 10 while l1.next != None: 11 l1 = l1.next12 a += l1.val*math.pow(10, i) 13 i += 1 14 # print (a) 15 i = 1 16 b = l2.val 17 while l2.next != None: 18 l2 = l2.next 19 b += l2.val*math.pow(10, i) 20 i += 1 21 # print (b) 22 23 result = str(int(a + b))[::-1]24 # print (result) 25 26 l = ListNode(int(result[0])) 27 p = l 28 29 for i in range(1, len(result)): 30 p.next = ListNode(int(result[i])) 31 p = p.next 32 33 return l
第二次嘗試:
使用連結串列按位相加。採用一個標誌位flag來表示該次計算有沒有產生進位,如果產生,flag=True,否則flag=False
注意點:1. 位數不相等時的處理方式。 2. 最後一位產生進位時的處理方式。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: flag = False l3 = ListNode(0) p3 = l3 while l1!=None and l2!=None: if flag == True: result = l1.val + l2.val + 1 # flag = False else : result = l1.val + l2.val if(result >= 10): flag = True result = result - 10 else: flag = False temp = ListNode(result) p3.next = temp p3 = temp l1= l1.next l2 = l2.next if l1 == None and l2 != None: while l2 != None: if flag == True: result = l2.val + 1 # flag = False else: result = l2.val if (result >= 10): flag = True result = result - 10 else: flag = False temp = ListNode(result) p3.next = temp p3 = temp l2 = l2.next if l2 == None and l1 != None: while l1 != None: if flag == True: result = l1.val + 1 # flag = False else: result = l1.val if (result >= 10): flag = True result = result - 10 else: flag = False temp = ListNode(result) p3.next = temp p3 = temp l1 = l1.next if l1 == None and l2 == None: if flag == True: p3.next = ListNode(1) return l3.next
程式碼簡化:
將集中判斷條件,簡化成一種形式。上面那種解法判斷條件多的一個原因是:每種情況我們得到的計算不同。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: # 建立一個結點值為 None 的頭結點, dummy 和 p 指向頭結點, dummy 用來最後返回, p 用來遍歷 dummy = p = ListNode(None) s = 0 # 初始化進位 s 為 0 while l1 or l2 or s: # 如果 l1 或 l2 存在, 則取l1的值 + l2的值 + s(s初始為0, 如果下面有進位1, 下次加上) s += (l1.val if l1 else 0) + (l2.val if l2 else 0) p.next = ListNode(s % 10) # p.next 指向新連結串列, 用來建立一個新的連結串列 p = p.next # p 向後遍歷 s //= 10 # 有進位情況則取模, eg. s = 18, 18 // 10 = 1 l1 = l1.next if l1 else None # 如果l1存在, 則向後遍歷, 否則為 None l2 = l2.next if l2 else None # 如果l2存在, 則向後遍歷, 否則為 None return dummy.next # 返回 dummy 的下一個節點, 因為 dummy 指向的是空的頭結點, 下一個節點才是新建連結串列的後序節點 作者:meng-zhi-hen-n 連結:https://leetcode-cn.com/problems/add-two-numbers/solution/zui-zhi-bai-de-xie-fa-by-meng-zhi-hen-n-2/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。