leetcode刷题笔记-06-两数相加

两数相加

  • 题目要求
    • 我的解题思路
    • 我的思路缺点

题目要求

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

我的解题思路

1.我们不断的遍历两个链表,每次遍历都将链表a和链表b的值相加,再赋给链表a。如果有进位我们还需要记录一个进位标志。
2.循环的条件是链表a不为空或者链表b不为空,这样当整个循环结束时,链表就被串起来了。
3.当循环结束时,如果进位标志>0还需要处理下边界条件。
4.我们不用生成一个新的节点,直接将两个节点相加的值赋给节点a就可以了,这样只用改变节点的内容,速度会更快一些。

最终返回 L1 即可。

# 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:
        #a,b分别指向链表ll,l2,p为总指针,即链接求和后的值的指针,carry为进位标志
        a,b,p,carry = l1,l2,None,0 
        while a or b:
            #val的值为俩链表值相加加上进位标志
            val = (a.val if a else 0)+(b.val if b else 0)+carry
            #加完后更新carry标志和val真实值,因为其值范围为0-9
            carry,val = 1 if val>=10 else 0,val%10
            #把p指针指向a,并且覆盖l1链表中的值
            p,p.val = a if a else b,val
            #a,b指针后移
            a,b = a.next if a else None,b.next if b else None
            #p的指针也随之后移指向后一位
            p.next = a if a else b
        #如果最后一位算完之后仍有进位,则把1添加到链表尾部
        if carry:
            p.next = ListNode(carry)
        return l1

我的思路缺点

执行用时 :76 ms, 在所有 python3 提交中击败了94.21% 的用户
内存消耗 :13.9 MB, 在所有 python3 提交中击败了5.06%的用户

你可能感兴趣的:(python)