题目要求
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题分析
由于他是倒叙存储的,所以实际上省去了很多的麻烦,我们可以通过一个关系式来进行计算:
s
=
x
+
y
+
c
a
r
r
y
s = x + y + carry
s=x+y+carry
说明一下,这里的x,y分别是第一,二个链表的当前值,carry意思是有无进位,0表示没有进位,1表示有进位。这样我们就可以得到当前两个链表元素的和,一次迭代直到两个链表为空即可。
有几点需要注意,因为两个链表可能不是等长,所以当一个链表结束,另一个链表还有元素的时候,我们就把已经结束的链表节点的值置为0,继续使用上面的公式计算,还有一点很重要,当运算结束后(即两个链表都为空时)我们还要进行一次进位的判断,这里非常非常重要!!!
主要代码python
# 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
"""
dummy = ListNode(0)
l3 = dummy
carry = 0
while l1 or l2:
# 记录l1的值,并移动
x = l1.val if l1 else 0
l1 = l1.next
# 记录l2的值,并移动
y = l2.val if l2 else 0
l2 = l2.next
s = carry+ x + y
# 进位除法判断, 本位取余数判断
pop = s//10
l3.next = ListNode(s%10)
l3 = l3.next
if pop > 0:
l3.next = ListNode(1)
return dummy.next
复杂度分析
时间复杂度:O(max(m,n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
空间复杂度:O(max(m,n)), 新列表的长度最多为 max(m,n)+1。