一、題目
Add Two Numbers
二、解題
1)題意
給出兩個(gè)鏈表,把對應(yīng)位置上的值進(jìn)行十進(jìn)制相加(有進(jìn)位),返回鏈表的根節(jié)點(diǎn)。
2)輸入輸出說明
輸入:兩個(gè)列表的根節(jié)點(diǎn)(并不是整個(gè)列表,即leetcode會(huì)把默認(rèn)生成好的列表的根節(jié)點(diǎn)傳入)
輸出:累加之后的根節(jié)點(diǎn)
3)關(guān)鍵點(diǎn)
1)做十進(jìn)制加法時(shí),使用和%10
來得出當(dāng)前位的值,使用/10
來得出進(jìn)位。
2)如果用常規(guī)解法,在處理不同長度的兩個(gè)鏈表是比較麻煩的。因此我使用了標(biāo)記的方法:
- 當(dāng)某個(gè)鏈表的next為空了,把其值(val)賦值為-1(題意中所有值都為非負(fù)數(shù),所以-1可以作為一個(gè)標(biāo)示,不會(huì)影響到原本的值)。
- 在兩個(gè)值相加之前,當(dāng)檢測到存在值為-1的時(shí)候,把值變成0,再進(jìn)行相加(因?yàn)槭羌?,所以并不影響結(jié)果)
- 跳出條件是兩個(gè)鏈表的值都為-1。
- 最后要判斷一次進(jìn)位的值是否不為0,如果不為0,需要補(bǔ)上一個(gè)node
4)為什么要賦值為-1,而不是直接賦值為0
因?yàn)槿绻苯淤x值為0,可能存在列表 3,0,3,即原本值就是0,而不是代表鏈表結(jié)束了,這樣會(huì)影響到鏈表。
三、嘗試與結(jié)果
class Solution(object):
def addTwoNumbers(self, l1, l2):
resultNode = None
add = 0
while True:
#當(dāng)val為-1的時(shí)候,說明已經(jīng)有l(wèi)ist遍歷完了,這個(gè)時(shí)候需要把val變成0
if l1.val == -1:
l1.val = 0
if l2.val == -1:
l2.val = 0
tSum = (l1.val + l2.val + add) % 10
add = (l1.val + l2.val + add) / 10
listn = ListNode(tSum)
if resultNode == None:
resultNode = listn
flagNode = resultNode
else:
flagNode.next = listn
flagNode = flagNode.next
if l1.next != None:
l1 = l1.next
else:
#直接改變當(dāng)前的節(jié)點(diǎn)的值
l1.val = -1
if l2.next != None:
l2 = l2.next
else:
l2.val = -1
#兩個(gè)都為-1了,說明兩個(gè)列表都遍歷完了
if l1.val == -1 and l2.val == -1:
break
if add != 0:
listn = ListNode(add)
flagNode.next = listn
return resultNode
結(jié)果:AC
四、完整調(diào)試代碼
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
resultNode = None
add = 0
while True:
if l1.val == -1:
l1.val = 0
if l2.val == -1:
l2.val = 0
tSum = (l1.val + l2.val + add) % 10
add = (l1.val + l2.val + add) / 10
listn = ListNode(tSum)
if resultNode == None:
resultNode = listn
flagNode = resultNode
else:
flagNode.next = listn
flagNode = flagNode.next
if l1.next != None:
l1 = l1.next
else:
l1.val = -1
if l2.next != None:
l2 = l2.next
else:
l2.val = -1
if l1.val == -1 and l2.val == -1:
break
if add != 0:
listn = ListNode(add)
flagNode.next = listn
return resultNode
if __name__ == '__main__':
print "----------------- start -----------------"
l1_1 = ListNode(2)
l1_2 = ListNode(4)
l1_3 = ListNode(3)
l1_1.next = l1_2
l1_2.next = l1_3
l2_1 = ListNode(5)
l2_2 = ListNode(6)
l2_3 = ListNode(4)
l2_1.next = l2_2
l2_2.next = l2_3
l3_1 = Solution().addTwoNumbers(l1_1,l2_1)
while l3_1 != None:
print l3_1.val
l3_1 = l3_1.next