Leecode刷题
题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
代码
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
时间复杂度:O(max(m,n)),m和n分别表示l1和l2的长度, 80ms beaten 73.95%
空间复杂度:O(max(m,n)),额外链表空间长度最多为max(m,n)+1,11.8MB beaten 29.46%。
“”"
# 允许使用额外空间
head = ListNode(0)
# 保存首节点位置,方便返回结果
res = head
# 初始化进位
carry = 0
while l1 != None or l2 != None:
# 获取本位的值,如果某一数长度将其记为0
x = l1.val if l1 else 0
y = l2.val if l2 else 0
# 计算结果,注意附加上进位carry
count = carry + x + y
# 进位结果,整除获取
carry = count // 10
# 保存结果,创建新节点
head.next = ListNode(count % 10)
# 移动各指针
head = head.next
# 对俩加数链表判空,针对高位加低位数的情况
if l1 != None:
l1 = l1.next
if l2 != None:
l2 = l2.next
# 遍历完俩加数指针,如果最高位出现进位结果,需要额外添加
if carry > 0:
head.next = ListNode(1)
return res.next