2. 两数相加(中)
题目
-
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题解:递归
- 仔细理解题意发现,不用逆转链表,刚好可以从两个链表的头开始相加,直接返回相加的结果就是题目的意思。
# 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]:
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
# 如果其中一个链表为空,直接返回另一个链表
if l1 is None:
return l2
if l2 is None:
return l1
# 将l1和l2对应节点的值相加,赋值给l1节点
l1.val += l2.val
# 如果相加的结果大于等于10,需要进位
if l1.val >= 10:
# 如果l1的下一个节点为空,创建一个新节点,并将其值初始化为0
if l1.next is None:
l1.next = ListNode(0)
# 如果l2的下一个节点为空,创建一个新节点,并将其值初始化为0
if l2.next is None:
l2.next = ListNode(0)
# 进位值1加到l1的下一个节点的值上
l1.next.val += 1
# 递归调用自身处理下一个节点的相加操作
l1.next = self.addTwoNumbers(l1.next, l2.next)
# 对l1节点的值取余,保留十位数上的值
l1.val %= 10
else:
# 递归调用自身处理下一个节点的相加操作
l1.next = self.addTwoNumbers(l1.next, l2.next)
# 返回l1链表,表示相加的结果
return l1