力扣:2、两数相加
力扣小白的自闭学习过程,争取做到每日更新,加油
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
一、迭代解法
解题思路
使用
n
e
x
t
1
=
1
o
r
0
next_1=1\ or\ 0
next1=1 or 0代表是否进位,并将结果存于
r
e
s
u
l
t
result
result。
class Solution:
# N is the size of l1, M is the size of l2
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
total = 0 # 代表两数相加的和等于多少
next1 = 0 # 代表是否向下一位进位
result = ListNode() # 最终要返回的结果集
cur = result # 引入中间变量作为指针辅助,避免链表违法,如:result.next.next
# 列出所有可能出现的情况
while (l1 != None and l2 != None): # 遍历l1和l2直至末尾
total = l1.val + l2.val + next1 # 计算两数以及进位之和
cur.next = ListNode(total % 10) # 将进位后剩余的值进行存储,存储位置是cur的下一个位置
next1 = total // 10 # 是否进位
cur = cur.next # 获取存储的值
l1 = l1.next # 选择l1的下一位
l2 = l2.next # 选择l2的下一位
while l1 != None: # 判断l1是否为空,遍历l1直至末尾
total = l1.val + next1
cur.next = ListNode(total % 10)
next1 = total // 10
cur = cur.next
l1 = l1.next
while l2 != None: # 判断l2是否为空,遍历l2直至末尾
total = l2.val + next1
cur.next = ListNode(total % 10)
next1 = total // 10
cur = cur.next
l2 = l2.next
if next1 != 0:
cur.next = ListNode(next1)
return result.next # 返回最终结果
复杂度
- 空间复杂度: O ( m a x ( M , N ) ) O(max(M,N)) O(max(M,N))
- 时间复杂度: O ( m a x ( M , N ) ) i f d u m m y i s c o u n t e d e l s e O ( 1 ) O(max(M,N))\ if \ dummy\ is\ counted\ else\ O(1) O(max(M,N)) if dummy is counted else O(1)
执行结果
参考内容:
1、https://www.bilibili.com/video/BV1Ar4y1N7x1?t=459