LeetCode第2題:兩數(shù)相加
Ps:本系列文章只為記錄自己刷LeetCode過程中的解題過程和思路。
題目描述:
給出兩個非空的鏈表用來表示兩個非負(fù)的整數(shù)。其中,它們各自的位數(shù)是按照逆序的方式存儲的,并且它們的每個節(jié)點只能存儲一位數(shù)字。
如果,我們將這兩個數(shù)相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)都不會以 0開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解題過程和思路:
這道題的題目很明確,按照我們手算的思路來:從低位到高位依次相加,并且有進(jìn)位就向高位進(jìn)位即可。其實就是用鏈表來存儲數(shù)字,并且用計算機(jī)模擬手算的過程罷了。但是這題以我目前的能力,不太理解要怎么操作才能加快算法的效率(不能打敗90%以上的人),留待以后補(bǔ)充。
解題收獲:
記得鏈表最初在C++中接觸過,其他語言中暫時沒有接觸過鏈表。這題讓我重復(fù)復(fù)習(xí)了一遍鏈表,并且熟悉了在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
"""
result_head = p = ListNode(None) # result_head為結(jié)果鏈表的頭結(jié)點(空的,返回的時候要返回 # result.next),p為用來遍歷的指針
s = 0 # 初始進(jìn)位為0
while l1 or l2 or s: # 如果l1非空或l2非空或有上一次計算有進(jìn)位s非0
s = s + (l1.val if l1 else 0) + (l2.val if l2 else 0)
val = s % 10 # eg. 21 % 10 = 1
s = s // 10 # eg. 21 // 10 = 2
p.next = ListNode(val) # 以val值新建一個結(jié)點
p = p.next # 結(jié)果鏈表的遍歷指針往下一位移
l1 = l1.next if l1 else None # 加數(shù)鏈表的指針對應(yīng)往下一位移
l2 = l2.next if l2 else None # 加數(shù)鏈表的指針對應(yīng)往下一位移
return result_head.next # 頭結(jié)點為空結(jié)點,因此返回頭結(jié)點的下一個結(jié)點
結(jié)果展示:

結(jié)果展示