445. 两数相加 II
原始题目链接:https://leetcode-cn.com/problems/add-two-numbers-ii/
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
解题思路:
题目给出的链表所表示的数字,从左到右是高位到低位,做加法需要从低位到高位开始相加进位来计算,所以想到使用两个栈来存储链表表示的节点的值。再考虑进位的关系,将两个链表从右向左开始计算节点表示的值,对10进行整除计算商和余数,商就是进位的值,余数就是要新建的链表的节点的值,新建的链表是从低位开始建立,因为先计算的低位的值的节点,所以初始化一个空节点ans,ans的指向经过计算,从低位到高位,最后指向的就是最高位,同时也是头结点,返回即可。具体实现看代码及注释。
代码实现:
# 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:
# 定义两个栈用于存储链表中的节点值
stack1, stack2 = [], []
# 最后的结果链表
ans = None
# 进位
carry = 0
while l1:
stack1.append(l1.val)
l1 = l1.next
while l2:
stack2.append(l2.val)
l2 = l2.next
while stack1 or stack2 or carry != 0:
a = 0 if not stack1 else stack1.pop()
b = 0 if not stack2 else stack2.pop()
num = a + b + carry
# res是余数,就是要生成的新节点的值
carry, res = divmod(num, 10)
# cur_node是从低位到高位来建立新的节点,根据是出栈的值是低位先出栈来计算
cur_node = ListNode(res)
cur_node.next = ans
# ans左移
ans = cur_node
return ans
参考文献:
https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/