两数相加

作者: 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 就是我们需要的结果

    总结

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

    相关文章

      网友评论

        本文标题:两数相加

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