1. 程式人生 > >2.兩數相加-leetcode(python)

2.兩數相加-leetcode(python)

  • 題目描述

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

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

  • 示例

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

  • 解決方案

        題意為:兩個逆序儲存表示整數的連結串列相加,和也是用逆序儲存的連結串列輸出。

        因此可以將兩個連結串列的同級節點正序相加,如果有進位則下一級節點的和需要加1,或者是做新增節點的操作(在最後一級節點之和大於10的情況下)

  • 程式碼
# 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
        """
        
        #一開始不做l1和l2的非空判斷,因為題中已經說明是非空連結串列
        #記錄是否需要增加新節點,或者在連結串列的下一個節點是否需要加1,同時記錄兩個連結串列同級節點的和
        carry = 0
        
        #這裡的執行順序是 res = ListNode(0),pre = res
        res = pre = ListNode(0)
        
        #判斷l1、l2、carry是否有值,carry有值的話需要增加節點,或者在連結串列下一個節點加1
        while l1 or l2 or carry:
            if l1:
                carry += l1.val
                l1 = l1.next
            
            if l2:
                carry += l2.val
                l2 = l2.next
                
            #carry現在是同級節點的和
            #divmod返回商與餘數的元組,分為carry和val
            #caarry不是0的話,需要新建節點或者在連結串列的下一個節點加1 ,在迴圈中用到
            carry,val = divmod(carry,10)
            
            #新建連結串列節點
            #執行順序是pre.next = ListNode(val)
            #pre = pre.next
            pre.next = pre =  ListNode(val)
        
        #res等價於pre ,res.val = 0,所以返回res.next
        return res.next
  • 待理解的地方
#這裡的執行順序是 res = ListNode(0),pre = res
        res = pre = ListNode(0)

       指標的問題,理解起來就是res = pre = ListNode(0)的話,也就是res和pre指向了同一個連結串列,而分開寫的話,pre是指向了複製的和res相同的另一個連結串列。