leetcode NO.2两数相加 腾讯精选练习50

题目描述

在这里插入图片描述

首先要了解链表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

猜你喜欢

转载自blog.csdn.net/qq_35547281/article/details/90071058