题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
官方思路:
自己的想法:
1.碰到链表与数组的的运算问题,首先一定要设置carry位。
2.可以适当的考虑创建一个空链表,存放要得到的结果,方便return。
代码1:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
re = ListNode(0) #设置一个空链表
r=re #给空链表命名为r
carry=0 #进位标识符
while(l1 or l2): #遍历l1与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
我们可以看到上面程序在时间和空间复杂度上并不理想,看一下是否有更好的方法。
方法2:
上边的方法额外生成了新的链表用于存放结果,是否有其他方法不用生成新的链表,在原有的链表的基础上进行计算。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
output = l1 #将输出的链表设置为l1
carry = 0 #进位标志位
while l1:
carry, l1.val = divmod(l1.val + l2.val + carry, 10) #divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
previous = l1 #previous相当于求和后的链表存放位置
l1, l2 = l1.next, l2.next
if (l1 is None) and (l2 is not None):
l1 = ListNode(0)
previous.next = l1
elif (l1 is not None) and (l2 is None):
l2 = ListNode(0)
if carry:
previous.next = ListNode(carry)
return output
补充:python内置函数
python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。