(python刷題)leetcode第2題:兩數相加

題目在leetcode上的鏈接爲:
https://leetcode-cn.com/problems/add-two-numbers/

題目描述
在這裏插入圖片描述
解題思路
將鏈表中對應節點數字進行相加的操作,同時注意考慮進位問題即可。具體的做法如下:
初始化進位數carry=0
初始化p1,p2分別爲l1,l2的頭節點
循環判斷當p1或者p2不爲空時:
如果p1不爲空,則將p1節點的值賦給x,如果p1爲空,則進行補零,將0賦給x
如果p2不爲空,則將p2節點的值賦給y,如果p2爲空,則進行補零,將0賦給y
此時的value值爲x+y+carry
如果value大於9,則將value置爲value-10且進位數carry置爲1;否則將carry置爲0
將value作爲值創建一個新的節點插入到新鏈表的尾部
判斷p1,p2是否爲空,如果不爲空則前進一個節點
循環結束後判斷進位數是否大於0,若大於0,則在新鏈表的尾部增加一個值爲carry的節點

解題思路中需要注意的兩點爲:
(1)當p1或者p2爲空時,要進行補零操作
(2)最後可能會存在進位的情況,需要考慮

複雜度分析:
設m,n分別表示鏈表l1,l2的長度
由於需要遍歷完兩個鏈表,所以該算法的時間複雜度爲o(max(m,n))
由於需要創建一個新的鏈表儲存結果,該算法的空間複雜度爲o(max(m,n)),需要創建的鏈表的最大長度爲o(max(m,n))+1

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
        """
        p1 = l1 
        p2 = l2 
        head = None
        current = None 
        carry = 0 #進位數
        while p1 != None or p2 != None:
            x = p1.val if p1 != None else 0
            y = p2.val if p2 != None else 0
            value = x + y + carry
            if value > 9:
                value = value - 10
                carry = 1
            else:
                carry = 0
            if head == None:
                head = ListNode(value)
                current = head 
            else:
                current.next = ListNode(value)
                current = current.next
            if p1 != None:
                p1 = p1.next
            if p2 != None:
                p2 = p2.next
        if carry > 0:
            current.next = ListNode(carry)
        return head

發佈了36 篇原創文章 · 獲贊 6 · 訪問量 5073
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章