题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,8]
输出:[7,0,2,1]
解释:342 + 865 = 1207
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
实现
数字都是逆序存储,需倒序相加后再将结果逆序存储,可以看成两个链表数字左对齐后相加,这样就很简单了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
c1, c2 = l1, l2
l = ListNode() # 开链表存储结果
c = l
tens = 0 # 十位上默认为0
while c1 and c2:
mod = (c1.val + c2.val + tens) % 10 # 取个位数
c.next = ListNode(mod)
c = c.next
tens = (c1.val + c2.val + tens) // 10 # 看十位有没有进位
c1 = c1.next
c2 = c2.next
# 只剩c1时
while c1:
mod = (c1.val + tens) % 10
c.next = ListNode(mod)
c = c.next
tens = (c1.val + tens) // 10
c1 = c1.next
while c2:
mod = (c2.val + tens) % 10
c.next = ListNode(mod)
c = c.next
tens = (c2.val + tens) // 10
c2 = c2.next
# 最后如果还有进位
if tens:
c.next = ListNode(1)
# c = c.next
return l.next
# 优化一下重复代码
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
c1, c2 = l1, l2
l = ListNode() # 开链表存储结果
c = l
tens = 0
while c1 or c2:
n1 = c1.val if c1 else 0
n2 = c2.val if c2 else 0
sum_ = n1 + n2 + tens
mod = sum_ % 10 # 取个位数
c.next = ListNode(mod)
c = c.next
tens = sum_ // 10 # 看十位有没有进位
c1 = c1.next if c1 else None
c2 = c2.next if c2 else None
# 最后如果还有进位
if tens:
c.next = ListNode(1)
# c = c.next
return l.next
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers