题目
给你两个 非空 的链表,表示两个非负的整数
它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字
请你将两个数相加,并以相同形式返回一个表示和的链表
你可以假设除了数字 0 之外,这两个数都不会以 0 开头
class Solution:
def addTwoNumbers(self, l1, l2):
# 当前指针,结果链表
result = curr = ListNode()
# 进位项
remainder = 0
# 非空满足循环条件
while l1 or l2 :
#l1是一个链表型,val是其属性,如果l1不为空则取l1.val否则取0
x = l1.val if l1 else 0
y = l2.val if l2 else 0
total = x + y + remainder
curr.next = ListNode(total%10)
remainder = total//10
# 🚩防止某一链表已经为空,空链表.next会报错
if l1 : l1 = l1.next
if l2 : l2 = l2.next
curr = curr.next
if remainder : curr.next = ListNode(remainder)
return result.next
- 初始化了一些变量:
- result 和 curr 都指向一个新创建的 ListNode,用于构建结果链表
- result = curr = ListNode()
- 多重赋值操作:创建了一个新的 ListNode 对象,并将这个对象的引用同时赋给了 result 和 curr 这两个变量
- 后续在操作链表时,可以通过 curr 来逐步构建链表,而 result 则用于最终返回整个链表的起始位置(因为 `result` 始终指向链表的头部,而 `curr` 会随着链表的构建而移动)
- remainder 用于存储进位值,初始化为 0
- 通过一个 while 循环,只要 l1 或 l2 不为空,就执行循环体:
- 从 l1 和 l2 中获取当前节点的值,如果链表为空则取值为 0 ,分别存储在 x 和 y 中
- 计算两节点值与进位值的总和 total
- 创建一个新的 ListNode 存储 total 对 10 取余的结果,并将其连接到当前结果链表的下一个节点
- 更新进位值 remainder 为 total 除以 10 的商
- 为了防止在循环中访问空链表的下一个节点导致错误,分别对 l1 和 l2 进行判断,如果不为空则将其指向下一个节点
- 将 curr 指针移动到新添加的节点
- 循环结束后,如果进位值 remainder 不为 0 ,则创建一个新节点存储进位值并连接到结果链表的末尾
- 最后,返回结果链表的下一个节点,即不包含初始创建的空节点。 例如,如果 `l1` 表示数字 342 (链表为:2 -> 4 -> 3),`l2` 表示数字 465 (链表为:5 -> 6 -> 4),经过这个方法的计算,最终得到的结果链表将表示数字 807 (链表为:7 -> 0 -> 8)