LeetCode题库2.两数相加(链表)python详细注释

版权声明:本人原创,转载请注明出处 https://blog.csdn.net/zjn295771349/article/details/88173042

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

答案:

链表的定义:

  链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。 

        很多的教材都是用C语言实现链表,因为C有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,因为python是动态语言,可以直接把对象赋值给新的变量。在C/C++中,通常采用“指针+结构体”来实现链表;而在Python中,则可以采用“引用+类”来实现链表。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        f = ListNode(0) #定义输出链表的第一个节点
        p = f #p类似于指针,代表输出链表的第一个节点
        carry = 0 #进位
        while l1 or l2: #判断l1和l2两个链表是否都结束了
            x = l1.val if l1 else 0 #如果l1链表没结束那么将l1的值给x,否则0给x
            y = l2.val if l2 else 0
            res = x + y + carry #与进位一起相加的结果
            carry = res // 10 #检查是否有进位
            p.next = ListNode(res%10) #下一个节点的地址给此时的节点
            p = p.next #这时p指向的是上一行定义的节点
            l1 = l1.next if l1 else 0 #如果链表l1没有了,那么要给l1赋值0,否则会报l1没有next属性的错
            l2 = l2.next if l2 else 0
        if carry > 0: #如果到最后还有进位,那么还要新建个节点记录进位的值
            p.next = ListNode(1)
        return f.next #返回的链表一定要从定义的输出链表f的第二个节点开始

参考资料:1.https://blog.csdn.net/weixin_37728031/article/details/81145258

                    2.https://www.cnblogs.com/yupeng/p/3413763.html

猜你喜欢

转载自blog.csdn.net/zjn295771349/article/details/88173042