题目描述
首先要了解链表ListNode是什么,其实解答区的注释有写
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
也就是有两个属性
一个是 .val ,一个是 .next
.val 是赋值x给它
.next 初始化是None,后面你可以随便赋一个东西给. next ,在我们这题是接上ListNode这个类
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
t = ListNode(0)
t.next = ListNode((l1.val + l2.val)%10)
p = l1.val + l2.val
q = p//10
t.next.next = ListNode(l1.next.val + l2.next.val + q)
t.next.next.next = self.addTwoNumbers(l1.next.next,l2.next.next)
if l1.next == None and l2.next == None:
t.next = None
return t
原先想调用函数自身来写,发现不对,调用自身到最后的时候最后一个链表是None,没有val这个属性
但是没想到怎么解决,调用自身其实是不可行的,然后看了大佬的答案豁然开朗
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0)
p = dummy
#注意类的copy是浅拷贝,对p的任何操作都会对dummy做同样的操作
carry_digit = 0
#carry_digit 用来记录这两位数相加是否大于10了,因为题目要求大于10的话,那个十位上的1要加到下一次两个数相加中去
p1 = l1
p2 = l2
while p1 and p2:
#这是针对l1,l2相同长度的情况
#既然调用到最后都是None的话(因为链表接的最后一个是None),那我就到None的时候停止就好了
#也就是p1=p1.next=None,p2=p2.next=None的时候
tmp = p1.val + p2.val + carry_digit
quotient = tmp // 10
#看看下一次的加法要补加几
remainder = tmp % 10
#这一次的相加必定取是余数的,可以想想就明白了
p.next = ListNode(remainder)
carry_digit = quotient
p1 = p1.next
p2 = p2.next
p = p.next
while p1:
#这种是对应l1比l2长的情况,较短的l2缺少的位置先当于用0补了
tmp = p1.val + carry_digit
quotient = tmp // 10
remainder = tmp % 10
p.next = ListNode(remainder)
carry_digit = quotient
p1 = p1.next
p = p.next
while p2:
#这种是对应l2比l1长的情况,较短的l1缺少的位置先当于用0补了
tmp = p2.val + carry_digit
quotient = tmp // 10
remainder = tmp % 10
p.next = ListNode(remainder)
carry_digit = quotient
p2 = p2.next
p = p.next
if carry_digit:
#最后一个位置的相加,如果超过了10,那么是要补一个next的,因为过10的十位要挪到下一次的运算中,但是下次的运算已经是None+None了,所以是0+0+carry_digit
p.next = ListNode(carry_digit)
return dummy.next