两数相加

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

链表

python 标准库并没有实现链表,所以我们得对链表这个了解. 可参考这里

解决方案

class Solution:
    @staticmethod
    def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:

        #进位
        flag = 0

        #头节点
        head=ListNode(0)

        #循环开始之前,上一个节点就是头节点
        pre_node = head

        #当前Node
        current_node=None

        # 当l1或l2位None的时候停止
        while (l1 or l2):

            # 如果 l1 不为空,则x 为l1 Node 的值
            x = l1.val if l1 is not None else 0

            # 如果 l2 不为空, 则 y 为 l2 Node 的值,否则就是 0
            y = l2.val if l2 is not None else 0

            #
            raw_add = x + y + flag

            # 取模得到相加后的node 的值
            add = raw_add % 10

            # 取整获取进位(python3 取整是 //)
            flag = raw_add // 10

            #当前node
            current_node = ListNode(add)

            #前一个node 的next 是  current_node
            pre_node.next = current_node

            #当前 node 为下次计算的 pre_node
            pre_node = current_node

            #下个循环开始
            if (l1 is not None): l1 = l1.next
            if (l2 is not None): l2 = l2.next

        #循环结束,如果进位还有值,则当前节点的 next 就是进位
        if (flag > 0):
            current_node.next = ListNode(flag)

        #从头节点开始,返回head 节点的next
        return head.next

思路

  • 新建头节点(head),上一个节点站(pre_node),当前node(current_node),进位flag
  • 遍历节点l1,l2,两个节点的值加上进位,就是当前节点(current_node)的值。
  • 遍历开始之前 pre_node 就是头节点(head)。pre_node 的next 应该是 current_node。下个循环开始之前 pre_node应该为当前节点(current_node)
  • 每次循环更新进位flag 、 上一个节点 pre_node l1 和 l2
  • 当循环结束,如果进位(flag)大于 0 时,则当前节点(current_node)的next 是ListNode(0)
  • 返回head.next 就是我们需要的结果

总结

这个算法主要考对链表的熟悉程度。及对链表数据结构的理解,只要理解了链表,做起来还是比较简单的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值