如果帮助到您,还请点个关注吧,hahaha
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
#最直观的思路
定义zero存放数字0,为了预防l1或l2的next为None
jinw为进位标志
result存放每次得到的结果
最初先判断若 cur1的值为0 且 cur1.next为None的话 证明cur1是空的(数字0)
则直接返回l2
同理判断l2是否为空
当l1和l2都不为空时,
则先计算l1、l2、jinw的和,若和大于等于10,则将进位标志变为1,同时将和-10,
只取差值就行。随后保存起来差值,并且取cur1和l2的下一个节点。
若节点为None,则用zero来代替。
当两个链表都遍历完后,我们直接将结果从新赋值给l1即可。
缺点:比较耗时
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
zero = ListNode(0)
jinw = 0
result = []
cur1 = l1
# print(l1)
if cur1.val == 0 and cur1.next == None:
return l2
elif l2.val == 0 and l2.next == None:
return l1
else:
while cur1 != None or l2 != None:
a = cur1.val + l2.val + jinw
jinw = 0
if a >= 10:
jinw = 1
a -= 10
result.append(a)
cur1 = (cur1.next != None and cur1.next or zero)
l2 = (l2.next != None and l2.next or zero)
if cur1 == zero and l2 == zero:
if jinw == 1:
result.append(jinw)
break
cur1 = l1
# print (cur1)
# print(result)
# print(l1)
for i in range(len(result)):
cur1.val = result[i]
if cur1.next == None and i != len(result) -1:
cur1.next = ListNode()
cur1 = cur1.next
print(l1)
return l1
# print (q)
#改进的思路
大致思路是一样的。只是在最初的时候定义一个新的链表l3直接用来存储运算结果。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
jinw = 0
l3 = ListNode(0)
cur3 = l3
while l1 or l2:
a = l1.val if l1 else 0
b = l2.val if l2 else 0
c = a + b + jinw
jinw = 0
if c >= 10:
jinw = 1
c -= 10
l3.next = ListNode(c)
print (l3.val)
l3 = l3.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
if jinw:
l3.next = ListNode(1)
return cur3.next