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%的用户

原文地址:https://www.cnblogs.com/xiaoqiangink/p/12894294.html