Leetcode Link: 2. 两数相加 - 力扣(LeetCode) (leetcode-cn.com)
题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解法一
思路:每次新建一个节点,公共部分直接计算放进去,有一个为None直接把指针指到不是None的上面,但是要注意jinWei的值要多判断,多考虑,
题解:我的版本,时间复杂度, 空间复杂度
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
jinWei = 0
newDummy = ListNode()
cur = newDummy
# 把重复部分相加
while(l1!=None and l2!=None):
# 保留个位数
val = (l1.val + l2.val + jinWei) % 10
# 计算进位,即计算十位数(这里不会)
jinWei =floor((l1.val + l2.val + jinWei - val) / 10)
newNode = ListNode(val)
cur.next = newNode
# 全部往下走, 这里经常把cur给忘了
l1 = l1.next
l2 = l2.next
cur = cur.next
# now 总是没有走完的那个
# 全走完了是None也行,进不去下面的while
now = l1 if l1!=None else l2
while(now != None):
if jinWei != 0:
val = (now.val + jinWei) % 10
jinWei = floor((now.val + jinWei - val) / 10)
newNode = ListNode(val)
cur.next = newNode
now = now.next
cur = cur.next
else:
cur.next = now
break
# 如果现在还有进位,则说明需要再加一个节点,比如 [5] + [5] = [0, 1]
if jinWei == 1:
newNode = ListNode(1)
cur.next = newNode
return newDummy.next上面每次都新建了一个,如果不新建的话,可以采用复用其中一个节点的方式,但是最好建立一个newDummy的头节点。然而这种方法会破坏其中一个链表。时间复杂度, 空间复杂度
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
jinWei = 0
newDummy = ListNode()
cur = newDummy
# 把重复部分相加
while(l1!=None and l2!=None):
val = (l1.val + l2.val + jinWei) % 10
jinWei =floor((l1.val + l2.val + jinWei - val) / 10)
l1.val = val
cur.next = l1
# 全部往下走, 这里经常把cur给忘了
l1 = l1.next
l2 = l2.next
cur = cur.next
# now 总是没有走完的那个
# 全走完了是None也行,进不去下面的while
now = l1 if l1!=None else l2
while(now != None):
if jinWei != 0:
val = (now.val + jinWei) % 10
jinWei = floor((now.val + jinWei - val) / 10)
now.val = val
cur.next = now
now = now.next
cur = cur.next
else:
cur.next = now
break
# 如果现在还有进位,则说明需要再加一个节点,比如 [5] + [5] = [0, 1]
if jinWei == 1:
newNode = ListNode(1)
cur.next = newNode
return newDummy.next启发和联系
本题中,最重要的是考虑题目中的示例3、4,jinWei的值要贯穿于整个算法中,时刻考虑该值,最后根据这个值来决定是不是需要添加新得尾节点。