两数相加
题目介绍#
难度中等
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
题解#
定义两个链表临时结点用于遍历链表。定义一个链表尾结点,尾节点指向末尾导数第二个结点。定义变量c存放进位。
遍历链表将两个临时结点的值相加并修改到l1链表中。如果两链表等长,则同时结束,如果l1链表长度大于l2链表长度,则l1与进位c相加的结果保存到l1中,如果l2链表长度大于l1链表长度,则l2与进位c相加的结果保存到l1中,此时l1需要创建新的结点(当然也可以之间将l2链表的结点连到l1链表后面)。
# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
p1 = l1
p2 = l2
tail = l1
c = 0
while p1 is not None and p2 is not None:
val = p1.val + p2.val + c
if val > 9:
p1.val = val % 10
c = 1
else:
p1.val = val
c = 0
tail = p1
p1 = p1.next
p2 = p2.next
while p1 is not None:
val = p1.val + c
if val > 9:
p1.val = val % 10
c = 1
else:
p1.val = val
c = 0
tail = p1
p1 = p1.next
while p2 is not None:
val = p2.val + c
tail.next = ListNode()
tail = tail.next
p1 = tail
if val > 9:
p1.val = val % 10
c = 1
else:
p1.val = val
c = 0
p2 = p2.next
if c == 1:
tail.next = ListNode()
tail = tail.next
p1 = tail
p1.val = 1
return l1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步