2. 两数相加
难度 中等
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
记几个的代码
自己写的,分开考虑共同位上都有的,共同位上只有一边有的,中间需特别注意进位,很多坑,感觉代码很臃肿,应该可以减少一半代码的吧,下面是加法函数代码
# 加法函数主体
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
carry, ret = 0, ListNode(0)
l3 = ret
# 存在共同位数,相加,进位
while l1 and l2:
val = (l1.val + l2.val + carry) % 10
carry = (l1.val + l2.val + carry) // 10
# l3创建并转移到下一个
l3.next = ListNode(val)
l3 = l3.next
# l1,l2移到下一个
l1 = l1.next if l1.next else 0
l2 = l2.next if l2.next else 0
# 不共同位
l1 = l1 if l1 else l2
while l1:
val = (l1.val + carry) % 10
carry = (l1.val + carry) // 10
l3.next = ListNode(val)
l3 = l3.next
l1 = l1.next if l1.next else 0
# 如果加完还有进位,则进位为1,再创建一个节点
if carry > 0: l3.next = ListNode(carry)
return ret.next
大神的代码
简直太简洁了!不用考虑是否共同位,直接在取值的地方判断是否还有值,在位移下一个的时候判断是否为空,这两个判断太漂亮了,学习
class Solution(object):
def addTwoNumbers(self, l1, l2):
re = ListNode(0)
r=re
carry=0
while(l1 or l2):
# 取值
x= l1.val if l1 else 0
y= l2.val if l2 else 0
# 计算
s=carry+x+y
carry=s//10
r.next=ListNode(s%10)
# 位移
r=r.next
if(l1!=None):l1=l1.next
if(l2!=None):l2=l2.next
# 最高位进位处理
if(carry>0):
r.next=ListNode(1)
return re.next
方法 | 运行时间 | 内存消耗 |
---|---|---|
记几个 | 68ms | 12.8MB |
大神 | 76ms | 12.9MB |
运行时间和内存消耗差不多,代码规范被大神完爆,记仇
下面给出完整可运行代码
# Definition for singly-linked list.
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
# 加法函数主体
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
re = ListNode(0)
r=re
carry=0
while(l1 or l2):
x= l1.val if l1 else 0
y= l2.val if l2 else 0
s=carry+x+y
carry=s//10
r.next=ListNode(s%10)
r=r.next
if(l1!=None):l1=l1.next
if(l2!=None):l2=l2.next
if(carry>0):
r.next=ListNode(1)
return re.next
if __name__ == "__main__":
# 创建(2 -> 4 -> 3)和(5 -> 6 -> 4)两个链表
a1 = ListNode(3)
a2, a2.next = ListNode(4), a1
a3, a3.next = ListNode(2), a2
b1 = ListNode(4)
b2, b2.next = ListNode(6), b1
b3, b3.next = ListNode(5), b2
# 执行加法
so = Solution()
result = so.addTwoNumbers(a3, b3)
# 输出
while result:
print(result.val)
result = result.next if result.next else 0