445. 两数相加 II

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值