zoukankan      html  css  js  c++  java
  • LeetCode 2. 两数相加

    题目:

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

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

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

    示例:

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


    思路

    看了这个题目最初的想法就是依次按位数取值拼接求和即可,看到提交页面的时候懵了一下,没有头绪,不知道数据怎么获取,随便print几个东西,看到输出提示,才知道怎么跑起来。

    题目给我们定好一个ListNode链表class,其中val用于获取当前位值,next指向下一组,初始值为None.

    要注意依次按位相加,小于10保留赋值当前位,大于10则取余进位+1,最后输出链表

    同时注意链表长度不等情况,需要检查该情况。

    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    #l1[2,4,3]为default测试条件
    print l1
    print l1.val
    print l1.next
    print l1.next.val
    #分别对应输出:
    ListNode{val: 2, next: ListNode{val: 4, next: ListNode{val: 3, next: None}}}
    2
    ListNode{val: 4, next: ListNode{val: 3, next: None}}
    4
    
    #可以赋值链表的方式进行链表的元素的添加
    res = ListNode(0)
    print res
    res2 = res
    print res2
    print ListNode(1)
    res2.next = ListNode(1)
    print res2
    print res
    res2.val = 2
    print res2
    print res
    
    res2 = res2.next #更新原链表,有点不理解这个链表行为,最开始,res赋值给res2,他俩是同一对象,不论谁更改,另一个内容都会对应改变,但当我把res2.next赋值给res2的时候,res和res2就是两种链表结构了,原来的=赋值状态应该被打破了,但是发现,把res2.val修改,res一样会变,虽然这就是我们要的预期结果,谁可以帮忙解惑一下这行为。
    print res2
    print res
    res2.val =3 
    print res
    print res2
    
    ListNode{val: 0, next: None}
    ListNode{val: 0, next: None}
    ListNode{val: 1, next: None}
    ListNode{val: 0, next: ListNode{val: 1, next: None}}
    ListNode{val: 0, next: ListNode{val: 1, next: None}}
    ListNode{val: 2, next: ListNode{val: 1, next: None}}
    ListNode{val: 2, next: ListNode{val: 1, next: None}}
    ListNode{val: 1, next: None}
    ListNode{val: 2, next: ListNode{val: 1, next: None}}
    ListNode{val: 2, next: ListNode{val: 3, next: None}}
    ListNode{val: 3, next: None}
    
    

    代码实现:

    class Solution(object):
        def addTwoNumbers(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            res = ListNode(0);#初始化一个0链表
            resTemp = res  #指向末节点,用于更新res链表
            nextSum = 0 #进位
            flag = 0	#首位flag
            while l1 and l2 : #l1 l2同时存在的时候
                if flag ==0: #首位相加
                    p = l1.val+l2.val+nextSum
                    res.val = p%10 #保留当前位相加结果
                    nextSum = p/10 #判断进位 0/1
                    flag =1
                else: #其它位相加
                    p = l1.val+l2.val+nextSum
                    resTemp.next = ListNode(p%10)
                    nextSum = p/10
                    resTemp =resTemp.next #将resTemp移动至下一位节点,方便下次运算
                l1 =l1.next #将l1指向下一级节点的链表
                l2 =l2.next	#将l2指向下一级节点的链表
            while l1: #判断l1是否还有额外的节点存在
                p = l1.val+nextSum
                resTemp.next = ListNode(p%10)
                nextSum = p/10
                resTemp =resTemp.next 
                l1 =l1.next
            while l2: #判断l2是否还有额外的节点存在
                p = l2.val+nextSum
                resTemp.next = ListNode(p%10)
                nextSum = p/10
                resTemp =resTemp.next 
                l2 =l2.next
            if nextSum ==1: #当l1,l2运算完毕后,如果当前进位值为1,则resTemp.next指向为1的链表作为最后一位数
           		 resTemp.next = ListNode(1)
            return res
    

    执行用时 :64 ms, 在所有 Python 提交中击败了80.39%的用户

    内存消耗 :12.8 MB, 在所有 Python 提交中击败了5.55%的用户

  • 相关阅读:
    汽车最强大脑ECU和单片机是什么关系
    自动驾驶汽车操作系统简述
    怎样区分线性和非线性_线性与非线性的区别(线性分析、线性模型)
    ADAS最全整理
    carsim2016 与 MATLAB2018 联合仿真send to simulink后编译不成功解决方法
    基于Jenkins的.Net Core应用自动部署--学习一
    vue学习一
    sql server解析xml字段
    C# string[] 转list<long>
    C++神奇算法库——#include<algorithm>
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/12894294.html
Copyright © 2011-2022 走看看