题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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%的用户