给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
1.我们不断的遍历两个链表,每次遍历都将链表a和链表b的值相加,再赋给链表a。如果有进位我们还需要记录一个进位标志。
2.循环的条件是链表a不为空或者链表b不为空,这样当整个循环结束时,链表就被串起来了。
3.当循环结束时,如果进位标志>0还需要处理下边界条件。
4.我们不用生成一个新的节点,直接将两个节点相加的值赋给节点a就可以了,这样只用改变节点的内容,速度会更快一些。
最终返回 L1 即可。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
#a,b分别指向链表ll,l2,p为总指针,即链接求和后的值的指针,carry为进位标志
a,b,p,carry = l1,l2,None,0
while a or b:
#val的值为俩链表值相加加上进位标志
val = (a.val if a else 0)+(b.val if b else 0)+carry
#加完后更新carry标志和val真实值,因为其值范围为0-9
carry,val = 1 if val>=10 else 0,val%10
#把p指针指向a,并且覆盖l1链表中的值
p,p.val = a if a else b,val
#a,b指针后移
a,b = a.next if a else None,b.next if b else None
#p的指针也随之后移指向后一位
p.next = a if a else b
#如果最后一位算完之后仍有进位,则把1添加到链表尾部
if carry:
p.next = ListNode(carry)
return l1
执行用时 :76 ms, 在所有 python3 提交中击败了94.21% 的用户
内存消耗 :13.9 MB, 在所有 python3 提交中击败了5.06%的用户