LeetCode-2.两数相加——链表及对其性质的理解

题目:两数相加

题图
该题目没有技巧和算法的考察,只是在挑战一些很容易出错的细节问题

right-code

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

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = ListNode(0)
        tmp = head
        add_one = 0
        while l1 is not None or l2 is not None:
            a = l1.val if l1 else 0
            b = l2.val if l2 else 0
            s = a + b + add_one    # 使用s变量承接加和结果,作为下一个节点.val变量的结果凭据
            if l1 is not None:
                l1 = l1.next
            if l2 is not None:
                l2 = l2.next
                
            add_one = 1 if s >= 10 else 0   # 进位计算
            s = s % 10
            tmp.next = ListNode(s)
            tmp = tmp.next
            
        if add_one == 1:
            tmp.next = ListNode(1)
        return head.next

【思路】:

  • l1/l2两个链表都空的情况下,结束循环。所以确定外层while循环的条件;
  • l1/l2哪个链表为空,就应该把它当成0计算;不为空,就让他next。
  • 有进位的情况需要被记录,所以新开一个变量add_one,专门用于记录进位与否;
  • 当前节点生成next新节点并移动tmp指针指向;
  • 整体循环结束后,若add_one节点是1,则需要在最后补上一个节点。0不需要补。

其实整体流程下来是真简单,但有很多坑到死的小细节,这些地方才是本题精髓:

  1. tmp指针应指向当前节点。若指向下一个节点,则会导致,当最后一位的加和无需进位时,你没法删除最后一个ListNode(0)。所以我们一上来就随意初始化一个head头结点,然后最终返回的是head.next,因为你只有在A节点的前驱节点上的时候,才可以执行A节点的删除/添加操作(通过操作A的前驱节点的.next指针达成)
  2. 新节点的取值应该新开一个变量存储(line 20
    对比我之前死活提示我“超出时间限制”的代码(下方错误代码“wrong-code”)。我之前的错误代码,就是因为直接修改了tmp.val参数。要注意,因为实际上tmp指针是指向当前节点的,而实际上我们计算得到的tmp.val是下一个节点tmp.next的取值。所以二者不能等同,直接用tmp.val接收计算结果(而不是s),会导致当前节点的.val参数被修改,这是不对滴

错误代码 wrong-code,未采用新变量存储加和结果

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

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = ListNode(0)
        tmp = head
        add_one = 0
        while l1 is not None or l2 is not None:
            a = l1.val if l1 else 0
            b = l2.val if l2 else 0
            tmp.val = a + b + add_one  # 错误在这里,未使用额外变量s接收加和结果,导致当前节点的.val变量被改动;实际上当前节点的.val参数应该是在tmp指针指向其前驱节点时就已被定义好的。
            if l1.next is not None:
                l1 = l1.next
            if l2.next is not None:
                l2 = l2.next
                
            add_one = tmp.val // 10   # 进位计算
            tmp.val =int(str(tmp.val)[-1])
            tmp.next = ListNode(tmp.val)
            tmp = tmp.next
            
        if add_one == 1:
            tmp.next = ListNode(1)
        return head.next
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_illusion_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值