leetcode題---鏈表中的兩數相加

解題思路一:最簡單的,就是把兩組組合成數字,再運用相加相加,再分拆各個數位上的數字。但這樣做耗時太大

解題思路二:

先把兩個數字個位數拿出來(例如題中的2和5),判斷有沒有進位(即是否大於9),若有進位,則carry=進位數 否則爲0。然後當兩個數字的十位上的數字相加時,還得把carry加上,再判斷是否有進位。

(做加數問題一定要注意:整除操作和求餘操作,與10整除能判斷是否存在進位,與10求餘操作能獲得該數位上的數字):

如18+34: 4+8 =12, 12/10 = 1,所以進位carry爲1,12%10 = 2,所以個位數上的數字爲2 。然後是十位1+3:1+3+carry=5,5/10=0,進位爲0就是沒有進位,然後5%10 = 5,所以十位上的數字爲5,所以18+34 = 52

代碼:

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

class Solution:
    def addTwoNumbers(self, l1, l2):
        prenode = ListNode(0)
        lastnode = prenode
        carry = 0 #進位一開始爲沒有進位
        while carry or l1 or l2:
            carry, val = divmod(carry + (l1.val if l1 else 0) + (l2.val if l2 else 0), 10) #找出進位和各個數位上的數字
            lastnode.next = ListNode(val)
            lastnode = lastnode.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        return prenode.next


def generateList(l: list):
    prenode = ListNode(0)
    lastnode = prenode
    for val in l:
        lastnode.next = ListNode(val)
        lastnode = lastnode.next
    return prenode.next


def printList(l: ListNode):
    while l:
        print("%d, " % (l.val), end='')
        l = l.next
    print('')


if __name__ == "__main__":
    l1 = generateList([1, 5, 8])
    l2 = generateList([9, 1, 2, 9])
    printList(l1)
    printList(l2)
    s = Solution()
    sum = s.addTwoNumbers(l1, l2)
    printList(sum)

 

拓展:

上提是鏈表中的數字是逆序的,就是500的話,鏈表中的數字放置是0-0-5,這樣就方便我們從個位開始計算。但是如果500在鏈表的放置方式是5-0-0呢?那我們就需要先對鏈表進行逆序操作。具體的逆序操作如下圖:

圖中逆序鏈表的頭節點是不動的,新的節點不是從鏈表尾部插入,而是從頭節點head的後面插入。如一條鏈表的順序爲8-5-1,則逆序時,它依次進入新鏈表的順序也是8-5-1,所以新鏈表從頭節點開始讀就是1-5-8了。

代碼:

def reverseList(l:ListNode):
    new = ListNode(0)
    while l!=None:
        val = ListNode(l.val)
        val.next = new.next
        new.next = val
        l = l.next
    return new.next

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章