【问题标题】:Why do we connect the same node to two different nodes at two different instances?为什么我们将同一个节点连接到两个不同实例的两个不同节点?
【发布时间】:2021-06-09 00:11:30
【问题描述】:

我找到了添加两个链表 l1 和 l2 的数字的解决方案(其中数字已颠倒)

例如

Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807

代码如下:

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        head=l3=ListNode()      
        carry=0
        while l1 or l2:
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0

            s=carry+x+y

            if s>9:
                carry = 1
            else:
                carry = 0

            s=s%10   

            l3.next=ListNode(s)    
            l3=l3.next

            if l2:
                l2=l2.next
            if l1:
                l1=l1.next

        if carry==1:
            l3.next=ListNode(1)

        return head.next

我的问题只是与两条l3.next 行有关(有两条)。对于第一个l3.next = ListNode(s),我可以看到我们只是将 l3 与一个新节点 ListNode(s) 连接起来——它保存了之前计算的值 s。

但是,我不太明白 l3.next = ListNode(1) 的作用!有任何想法吗?我可以理解它-我们说if carry==1(即前两位数字的总和> 9)然后我们将l3连接到值为1的新节点?

或者l3.next = ListNode(1)'在l3之后的节点上加1?';这对我来说仍然没有意义,因为s=carry+x+y 会考虑进位。

【问题讨论】:

    标签: python linked-list


    【解决方案1】:

    l3.next=ListNode(1) 行仅在循环结束后仍有进位时执行。它不是循环的一部分。

    我们来看这个例子:

     [5, 5, 5] +
     [5, 5, 5]
    

    使用此输入,循环将迭代 3 次,在循环之后,l1l2 都是 null。在第一次迭代中,我们计算 0 + 5 + 5。但这给出了进位。所以下一次迭代我们计算 1 + 5 + 5。我们再次有进位。第三次(也是最后一次)迭代我们再次计算 1 + 5 + 5。再次进位。但是由于循环不再迭代,我们没有对那个进位做任何事情。

    我们需要在结果中添加一个额外的节点来存储这个额外的 1。

    换句话说,此代码处理结果中的位数比具有最多位数的输入的位数多一个的情况。这个额外的数字 - 如果存在 - 始终是 1。它不能是 2 或更多。用纸笔加多位数字也是一样的道理。

    【讨论】:

    • 谢谢Trincot,像往常一样完美的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2018-12-26
    • 1970-01-01
    • 2019-04-10
    • 2021-01-09
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多