输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807class ListNode:
def __init__(self, x):
self.val = x
self.next = None
解题思路:
本题的难点主要在于输入为指定的类,另外是相加时注意后一位的进位。
先写测试代码,分别为List和ListNode互相转换,便于输入和输出:
def listToListnode(list):
prevNode = None
for i in range(len(list) - 1, -1, -1):
nextNode = ListNode(list[i])
nextNode.next = prevNode
prevNode = nextNode
return nextNode
listToListnode
def listnodeToList(listnode):
list = []
while listnode != None:
list.append(listnode.val)
listnode = listnode.next
return list
解题思路1:
其实理解了指定类后,本题的难度很小,只是普通的加法:
listResult = []
addOne = False
while l1 != None or l2 != None:
if l1 == None:
val1 = 0
else:
val1 = l1.val
if l2 == None:
val2 = 0
else:
val2 = l2.val
sum = val1 + val2 + int(addOne)
addOne = False
if sum >= 10:
sum = sum - 10
addOne = True
listResult.append(sum)
if l1!= None:
l1 = l1.next
if l2!= None:
l2 = l2.next
if addOne:
listResult.append(1)
# print(listResult)
prevNode = None
for i in range(len(listResult) - 1, -1, -1):
nextNode = ListNode(listResult[i])
nextNode.next = prevNode
prevNode = nextNode
return nextNode
116 ms,打败了68.97%的对手。
我的算法多次判断了是否为None,以及放到数组其实也是多余的行为,如果能直接放进ListNode,不用转数组就好了。
解题思路2:
看了LeetCode官方思路,它使用了递归。改成和官方相同的思路为:
addOne = False
initNode = ListNode(1)
listNode = initNode
while l1 != None or l2 != None:
if l1 == None:
val1 = 0
else:
val1 = l1.val
if l2 == None:
val2 = 0
else:
val2 = l2.val
sum = val1 + val2 + int(addOne)
addOne = False
if sum >= 10:
sum = sum - 10
addOne = True
listNode.next = ListNode(sum)
listNode = listNode.next
if l1!= None:
l1 = l1.next
if l2!= None:
l2 = l2.next
if addOne:
listNode.next = ListNode(1)
return initNode.next
164 ms,打败了30.60%的对手。
[沉思],看来数组还是个比较便捷的算法,比新建类好用。