解题思路一:最简单的,就是把两组组合成数字,再运用相加相加,再分拆各个数位上的数字。但这样做耗时太大
解题思路二:
先把两个数字个位数拿出来(例如题中的2和5),判断有没有进位(即是否大于9),若有进位,则carry=进位数 否则为0。然后当两个数字的十位上的数字相加时,还得把carry加上,再判断是否有进位。
(做加数问题一定要注意:整除操作和求余操作,与10整除能判断是否存在进位,与10求余操作能获得该数位上的数字):
如18+34: 4+8 =12, 12/10 = 1,所以进位carry为1,12%10 = 2,所以个位数上的数字为2 。然后是十位1+3:1+3+carry=5,5/10=0,进位为0就是没有进位,然后5%10 = 5,所以十位上的数字为5,所以18+34 = 52
代码:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def addTwoNumbers(self, l1, l2):
prenode = ListNode(0)
lastnode = prenode
carry = 0 #进位一开始为没有进位
while carry or l1 or l2:
carry, val = divmod(carry + (l1.val if l1 else 0) + (l2.val if l2 else 0), 10) #找出进位和各个数位上的数字
lastnode.next = ListNode(val)
lastnode = lastnode.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return prenode.next
def generateList(l: list):
prenode = ListNode(0)
lastnode = prenode
for val in l:
lastnode.next = ListNode(val)
lastnode = lastnode.next
return prenode.next
def printList(l: ListNode):
while l:
print("%d, " % (l.val), end='')
l = l.next
print('')
if __name__ == "__main__":
l1 = generateList([1, 5, 8])
l2 = generateList([9, 1, 2, 9])
printList(l1)
printList(l2)
s = Solution()
sum = s.addTwoNumbers(l1, l2)
printList(sum)
拓展:
上提是链表中的数字是逆序的,就是500的话,链表中的数字放置是0-0-5,这样就方便我们从个位开始计算。但是如果500在链表的放置方式是5-0-0呢?那我们就需要先对链表进行逆序操作。具体的逆序操作如下图:
图中逆序链表的头节点是不动的,新的节点不是从链表尾部插入,而是从头节点head的后面插入。如一条链表的顺序为8-5-1,则逆序时,它依次进入新链表的顺序也是8-5-1,所以新链表从头节点开始读就是1-5-8了。
代码:
def reverseList(l:ListNode):
new = ListNode(0)
while l!=None:
val = ListNode(l.val)
val.next = new.next
new.next = val
l = l.next
return new.next