题目描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入示例:
输入:(2-> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路
该题是一道普通的链表遍历题,唯一需要注意的的是对进位的处理。
大体思路为:循环对两个链表上每位上的数值相加并加上进位step,此时得到的和sum可能大于9,那么更新step为1,否则记step为0。当step为0,两个链表均到达尾端时,终止循环
代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def addTwoNumbers(l1, l2):
"""
逐位相加,考虑进位
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result = []
node1 = l1
node2 = l2
step = 0 # 记录进位
while not (node1 is None and node2 is None and step == 0):
m = n = 0
if node1 is not None:
m = node1.val
node1 = node1.next
if node2 is not None:
n = node2.val
node2 = node2.next
sum = m + n + step # 累加进位
sum2 = sum % 10 # 取余
result.append(sum2)
if sum != sum2:
step = 1 # 记录进位
else:
step = 0
return result
参考
- [1] leetcode原题
- [2] 详尽源码