题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
- 题目数据保证列表表示的数字不含前导零
分析:
首先这道题目说给了我们两个链表来储存数据,并且我们最后输出也要以链表的形式输出,但我们要知道python是没有链表的,只能用一个对象来实现,题目的初始代码也给了我们链表的结构:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
我们的val就是存储数值的地方,而next就是所谓的指针了
根据题目给的注释可得l1,l2,可以是ListNode类型也可以是空的,所以说要小心“NoneType”错误,
并且题目告诉我们,返回值也应该是一个None或者ListNode类型
解答:
首先,我们应该创建一个链表:
result = ListNode(0)
temp = result
vlag:int = 0
这里的vlag是进位,我们在循环中不仅要以l1,l2是否为空来做判断,还要以此作为判断,因为到最后可能有进位,但l1和l2都为空的情况,temp则是我们的指针 temp = result并不是创建了一个新的对象,而是它的地址等于result这样改变temp就等于改变result
接下来就是写我们的循环,循环中要实现的就是我们加法进位的问题和当前节点怎么到下一个节点的问题:
while vlag or l1 or l2:
if l1:
val1 = l1.val
else:
val1 = 0
if l2:
val2 = l2.val
else:
val2 = 0
sum = val1 + val2+vlag
score = (sum)%10
vlag = (sum)//10
这里就能实现进位的处理,如果不判断l1和l2是否为空的话,那么在l1.val或者l2.val的时候就会出现“NoneType”的问题,score就是我们要赋给链表下一个节点的值,vlag则是我们的进位
接下来就是我们跳到下一个节点的代码,这一步很简单,但要小心(就是要再次判断l1和l2是否为空,不然就会犯"Nonetype"的错误)
temp.next = ListNode(score)
temp = temp.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
最后就是我们的返回值了,由于我们刚开始设置了一个空的节点,这个节点里没有存放任何有效的值,所以我们要从下一个节点开始返回
return result.next