2. 两数相加
题目描述:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
测试示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路:
类比于手写列式相加,从个位数对齐相加,大于 10 则进位,依次递归。需要考虑以下几种情况:
- 两数均为空
两数均为空是递归的跳出条件,但在跳出前需要考虑是否存在来自上一位的进位值 - 两数存在一个不为空
将为空的链表数初始化为数值 0 进行下一步操作;当两数的节点数值均存在时相加,并递归到下一个节点。
class Solution(object):
def addTwoNumbers(self, l1, l2):
return self.add_node(l1, l2)
def add_node(self, l1, l2, carry=0):
if not l1 and not l2:
return ListNode(1) if carry else None
l1 = l1 if l1 else ListNode(0)
l2 = l2 if l2 else ListNode(0)
if l1.val >= 0 and l2.val >= 0:
l1.val = l1.val + l2.val + carry
c = 0
if l1.val >= 10:
l1.val -= 10
c = 1
l1.next = self.add_node(l1.next, l2.next, c)
return l1