2. 两数相加——python版(做题解析)

题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

# 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: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(val = l1.val + l2.val)
        cur = head
        while l1.next or l2.next:
            l1 = l1.next if l1.next else ListNode()
            l2 = l2.next if l2.next else ListNode()
            cur.next = ListNode(val = l1.val + l2.val + cur.val//10)
            cur.val = cur.val % 10
            cur = cur.next
        if cur.val >=10:
            cur.next = ListNode(cur.val//10)
            cur.val = cur.val % 10
        return head

解题思路:作为中级题的第一题。在python中不存在已经建立的数据结构,所以需要通过自行建立ListNode类的方式来实现。在Solution这个类中,只是对链表结构中的数据进行运算就可以了。

重点解析
1.class ListNode:
… 创建一个类,在类的内部写用到的数据和方法
要构建链表类(结构)就需要一个变量(val)来存储值,和另一个变量(next)来存储下一个地方的连接地址.
2.def init(self, val=0, next=None):使用__init__魔法方法。魔法方法也就是在调用类的时候,会自动执行的方法。这里init方法是用来初始化数据的。
3.l1: ListNode, l2: ListNode :这里给传入的变量l1,l2加上注释,希望传入的l1,l2是链表类,这样才能进行下面的操作。
4.head = ListNode(val = l1.val + l2.val):定义一个叫head的(实例)变量是ListNode类传入的参数是(val = l1.val + l2.val,next = None) 这是整个链表的最后一个所以next是None
5.cur = head:这是指针代替你用head执行下面的操作
6.l1.val, l1.next是用来存储地址的,就拿示例为例,
第一个l1.val = 2, l1.next=地址(存储数字4的地址)
第二个l1.val.val = 4, l1.next.next=地址(存储数字3的地址)
第三个l1.val.val.val = 3, l1.next.next.next=None(后面没东西了)
7.cur.next = ListNode(val = l1.val + l2.val + cur.val//10):第一次执行是对第二位数字的大小进行赋值
这里cur.val//10是如果前面数字进位了在这里加1
8.cur.val = cur.val % 10:这里也是避免数字大于10
9.cur = cur.next:整体向后一个位置走一格
10.if cur.val >=10:最后一位还是存在进位的问题的所以,还是要单独考虑,因为后面.next是None所以要创建一个新的"车厢"
11.return head:将这一长串车厢返回给别人.

处理结果
在这里插入图片描述
尽力了,博主也是个小白,想尽量给大家解释明白,轻喷
写这么多主要是我自己也卡在这里好久,自学的时候还是有很多不明白的,想了好久才想通
大家有什么不明白的地方可以留言,博主尽量给大家解答,大家也可以相互解答

来源:力扣(LeetCode)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值