两数相加
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
Python代码
思路是这样的,因为个人认为题目中的特殊情况太多,下面列举一些特殊情况:
- l1比l2短,包含空的情况
l1 = [ ] , l2 = [ 0 , 1 ]
- l2比l1短
l1 = [ 0 , 1 ], l2 = [ 0 ]
- 溢出的情况
l1 = [ 9 , 9 ], l2 = [ 1 ]
对于这些情况,我们做小学数学时候,没有考虑过,拿来两个数加就是了,没有什么特殊请款了,所以为什么不把题目转化为普通的加法呢?
# 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
"""
link= l = ListNode(0)
numl1 = 0 # l1初始值
numl2 = 0 # l2初始值
i = 1
while l1: # 计算l1所代表的十进制数字
numl1 = l1.val*i + numl1
l1 = l1.next
i *= 10
j = 1
while l2: # 计算l2所代表的十进制数
numl2 = l2.val*j + numl2
l2 = l2.next
j *= 10
num = numl1+numl2 # 两个数字做加法
int2str = str(num) # 把数字转为字符串,方便变成链表
for i in range(len(int2str) - 1, -1, -1): # 把数字倒着放到链表中
l.val = int(int2str[i])
if i:
l.next = ListNode(0)
l = l.next
return link
执行用时 : 88 ms, 在Add Two Numbers的Python提交中击败了48.06% 的用户
内存消耗 : 12 MB, 在Add Two Numbers的Python提交中击败了0.86% 的用户
在评论区发现了模仿题解的代码,粘贴过来
class Solution:
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
执行用时 : 132 ms, 在Add Two Numbers的Python提交中击败了6.91% 的用户
内存消耗 : 11.9 MB, 在Add Two Numbers的Python提交中击败了0.86% 的用户
模仿的还不错,感谢just2。