zoukankan      html  css  js  c++  java
  • LeetCode刷题实战2:两数相加

    题目描述

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

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

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

    示例

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

    解答

          题目不难理解,思路也很容易想明白,其实就是模拟小学生打竖式计算加减的方法,来计算两个整数的加和。但是既然是加法,就可能涉及进位,比如两个两位数之和可能是一个三位数。还有一个难点是需要使用链表来实现,涉及链表,编码的复杂度会更大一些。

          在开始编码前,我们先仔细观察样例:

          我们发现,由于链表存储数字的顺序和常规的顺序相反,所以如果存在进位的情况,我们只需要在链表的结尾加上一个节点即可。通常的计算是从右往左,而在链表当中可以理解为从左到右,其实也就是按照链表遍历的顺序计算。这点想明白,并没有什么问题。

          我们做一个总结,难点大概有三个:

          1. 因为不是数组,所以我们无法拿到链表的长度。会出现两个链表长度不一致的情况;

          2. 返回结果也是一个链表,需要我们自己手动创建;

          3. 计算产生的进位处理。

          我们一个一个来分析,链表的长度未知很好处理,我们只需要判断当前节点的 next 节点是否为空,就可以知道链表后面是否还有后继。如果没有,那么就说明链表已经遍历到头了。

          由于本题当中存在两个链表,我们需要同时判断它们是否结束:

    while (l1 || l2){
        if (l1): l1 = l1 -> next;
        if (l2): l2 = l2 -> next;
    }
    

          手动创建链表也并不复杂,我们首先创建一个链表的节点,然后依次往节点后方插入节点即可。链表插入的方式也很简单,假设当前的节点是 cur,待插入的节点是 node,那么我们只需要用 cur.next 指向 node,然后将 cur 赋值成 node 即可。

    cur -> next = node;
    cur = node;
    

          计算产生的进位问题就更简单了,由于我们是按位来计算加法,所以我们可以用一个变量标记之前位是否发生进位。如果发生,那么当前的计算结果加一。因为加法计算,最多的结果只能达到 19(两位 9 再加上之前的进位),所以进位最多只会增加 1。最后,再判断一下当前位计算的结果是否产生进位即可。

    int ret = l1->val + l2->val;
    if (exceed) ret++;
    if (ret > 9){
        ret -= 10;
        exceed = true;
    }
    else exceed = false;
    

          最后,我们只需要把上述说到的三点结合起来,就可以写出代码了。

    class Solution:
        def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
            dummyHead = ListNode(0)
            cur = dummyHead
            carry = 0
            while l1 or l2:
                valL1 = l1.val if l1 else 0
                valL2 = l2.val if l2 else 0
                total = valL1 + valL2 + carry
                carry = total // 10
                cur.next = ListNode(total % 10)
                cur = cur.next
                if l1:  
                    l1 = l1.next
                if l2:
                    l2 = l2.next
            if carry > 0:            
                cur.next = ListNode(carry)
            return dummyHead.next
    
  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/chenjin2018/p/14049759.html
Copyright © 2011-2022 走看看