【算法Hot100系列】两数相加

2023-12-13 16:04:16

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ?? 欢迎订阅本专栏 ??

一.题目描述

1.题目信息

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

2.题目地址

题目地址

3.示例

示例 1:

image-20231213140847885

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

4.提示

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

二.题解

1.递归解决

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    return dfs(l1, l2, 0);
}


private ListNode dfs(ListNode l1, ListNode l2, int i) {
    //递归的终止条件
    if (l1 == null && l2 == null && i == 0) {
        return null;
    }
    //递归的过程
    int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + i;
    final ListNode listNode = new ListNode(sum % 10);
    listNode.next = dfs(l1 == null ? null : l1.next, l2 == null ? null : l2.next, sum / 10);
    return listNode;
}

2.迭代解决

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode l3 = new ListNode(0);
    ListNode l4 = l3;
    int count = 0;
    while (l1 != null || l2 != null) {
        int x = l1 == null ? 0 : l1.val;
        int y = l2 == null ? 0 : l2.val;
        int sum = x + y + count;
        count = sum / 10;
        l4.next = new ListNode(sum % 10);
        l1 = l1 == null ? null : l1.next;
        l2 = l2 == null ? null : l2.next;
        l4 = l4.next;
    }
    if (count == 1) {
        l4.next = new ListNode(1);
    }
    return l3.next;
}

3.解题思路

  1. 遍历链表
  2. 一定有 3 个链表
  3. 不断递进

4.关键点

  • 注意当前结果是num%10余数
  • 递进一位num/10
  • 注意最后一位的判断,可能为 1
  • 递归方法注意递归的三要素

三.自我分析

1.解题思路

if 有思路
    开写
else
    去看相关标签,确定具体解题方法
    if 有思路
        开写
    else
        看提示信息
        if 有思路
            开写
        else
            看答案

2.思考链路

  • 没有思路
  • 多做,多思考
  • 形成自己的肌肉记忆
  • 多多调试

觉得有用的话点个赞 👍🏻 呗。
??????本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

文章来源:https://blog.csdn.net/qyj19920704/article/details/134970994
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。