【LeetCode】2.Add Two Numbers 两数相加

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

class 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%的对手。
[沉思],看来数组还是个比较便捷的算法,比新建类好用。

猜你喜欢

转载自blog.csdn.net/tiantuanzi/article/details/83788639