【leetcode】2. 两数相加

算法汇总

以下是所有算法汇总,包括GitHub源码地址链接:力扣算法练习汇总(持续更新…)

题目

2. 两数相加
在这里插入图片描述

关键点

1、链表2->4->3,对应的值是342;
2、

代码

1.模拟法 1- 行不通(超出int最大范围)

思路

1、两个链表各自求和
2、定义新链表然后赋值

思路中的缺陷:
1、1、int类型的最大范围-2147483648 和 2147483647 ,当用例输入是1999999999的时候,真实数字是9999999991会超出int最大范围。

 /**
     *  1、int类型的最大范围-2147483648 和 2147483647(10位)  (string类型倒是没有范围限制)
     *  2、用例9999999991(10位)会报错(超出integer范围):
     *  java.lang.NumberFormatException: For input string: "9999999991"
     *   at line 67, java.base/java.lang.NumberFormatException.forInputString
     *   at line 668, java.base/java.lang.Integer.parseInt
     *   at line 999, java.base/java.lang.Integer.valueOf
     *   at line 18, Solution.addTwoNumbers
     *   at line 54, __DriverSolution__.__helper__
     *   at line 87, __Driver__.main
     * @param l1
     * @param l2
     * @return
     */

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public  ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 链表1的值
        String val1 = getVal(l1);
        // 链表2的值
        String val2 = getVal(l2);
        // 结果值
        String resultVal = (Integer.valueOf(val1) + Integer.valueOf(val2)) + "";
        // 定义一个虚拟头节点
        ListNode resultNode = new ListNode(0);
        // 记录链表最后一个节点指针
        ListNode nextNode = resultNode;
        for(int i = resultVal.length() - 1; i >= 0; i--){
            ListNode curNode = new ListNode(Integer.valueOf(resultVal.charAt(i) + ""));
            nextNode.next = curNode;
            nextNode = nextNode.next;
        }
        return resultNode.next;
    }
    public  String getVal(ListNode node){
        String valStr = "";
        ListNode temp = node;
        while(temp != null){
            // 链表2->4->3,对应的值是342;
            valStr = temp.val + valStr;
            temp = temp.next;
        }
        return valStr;
    }
}

时间和空间复杂度

2.模拟法2

思路

从左至右相加,如果满10,后面加1(正常加法逻辑是满10前面加1)
2 4 3
+5 6 4

7 0 8

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public  ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //定义一个新联表伪指针,用来指向头指针,返回结果
        ListNode prev = new ListNode(0);
        //定义一个进位数的指针,用来存储当两数之和大于10的时候,
        int carry = 0;
        //定义一个可移动的指针,用来指向存储两个数之和的位置
        ListNode cur = prev;
        //当l1 不等于null或l2 不等于空时,就进入循环
        while(l1!=null || l2!=null){
            //如果l1 不等于null时,就取他的值,等于null时,就赋值0,保持两个链表具有相同的位数
            int x= l1 !=null ? l1.val : 0;
             //如果l1 不等于null时,就取他的值,等于null时,就赋值0,保持两个链表具有相同的位数
            int y = l2 !=null ? l2.val : 0;
            //将两个链表的值,进行相加,并加上进位数
            int sum = x + y + carry;
            //计算进位数
            carry = sum / 10;
            //计算两个数的和,此时排除超过10的请况(大于10,取余数)
            sum = sum % 10;
            //将求和数赋值给新链表的节点,
            //注意这个时候不能直接将sum赋值给cur.next = sum。这时候会报,类型不匹配。
            //所以这个时候要创一个新的节点,将值赋予节点
            cur.next = new ListNode(sum);
            //将新链表的节点后移
            cur = cur.next;
            //当链表l1不等于null的时候,将l1 的节点后移
            if(l1 !=null){
                l1 = l1.next;
            }
            //当链表l2 不等于null的时候,将l2的节点后移
            if(l2 !=null){
                l2 = l2.next;
            } 
        }
        //如果最后两个数,相加的时候有进位数的时候,就将进位数,赋予链表的新节点。
        //两数相加最多小于20,所以的的值最大只能时1
        if(carry == 1){
            cur.next = new ListNode(carry);
        }
        //返回链表的头节点
        return prev.next;
    }
}

时间和空间复杂度

根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@来杯咖啡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值