两数相加

作者: ifjgm | 来源:发表于2019-05-23 19:25 被阅读1次

题目描述

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

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

您可以假设除了数字 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 就是我们需要的结果

总结

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

相关文章

  • 两数相加

    题目 You are given two non-empty linked lists representing ...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    两数相加 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一...

  • 两数相加

    两数相加: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    题目 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新...

  • 两数相加

    题目描述: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    问题链接:https://leetcode-cn.com/explore/interview/card/top-i...

  • 两数相加

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

  • 两数相加

    题目描述 给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回...

网友评论

    本文标题:两数相加

    本文链接:https://www.haomeiwen.com/subject/aktizqtx.html