原题

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

思路及解法

思路

这个题跟2. 两数相加基本一样。

一个是正着算,另一个是倒着算。

那么我们只要把这两个链表翻转就好了!

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {l1 = reverse(l1);l2 = reverse(l2);int carry = 0;ListNode *ans = nullptr;while (l1 != nullptr || l2 != nullptr || carry != 0) {int a = (l1 != nullptr) ? l1->val : 0;int b = (l2 != nullptr) ? l2->val : 0;int sum = a + b + carry;carry = sum / 10;sum %= 10;auto cur = new ListNode(sum);cur->next = ans;ans = cur;if (l1 != nullptr) {l1 = l1->next;}if (l2 != nullptr) {l2 = l2->next;}}return ans;}ListNode *reverse(ListNode *head) {ListNode *node = nullptr;while (head) {ListNode *cur = head->next; //保存head->next结点信息head->next = node;          //反转指向node = head;                //后移nodehead = cur;                 //后移head}return node;}
};

个人觉得最难的是这几行代码,初次写代码也是不易想到的。

      auto cur = new ListNode(sum);cur->next = ans;ans = cur;

注意:这里的 new ListNode(sum) 不是指开辟一个大小为 sum 的链表!


new ListNode(sum) 不仅仅为对象 ListNode在堆上分配了空间, 而且还调用了 ListNode 的默认拷贝构造函数,生成了这个对象。

new List Node[sum] 仅仅分配了空间。


题目要求不翻转链表,那么我们用栈来实现即可!

优化

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {stack<int> s1, s2;while (l1) {s1.push(l1->val);l1 = l1->next;}while (l2) {s2.push(l2->val);l2 = l2->next;}int carry = 0;ListNode *ans = nullptr;while (!s1.empty() || !s2.empty() || carry != 0) {int a = (!s1.empty()) ? s1.top() : 0;int b = (!s2.empty()) ? s2.top() : 0;int sum = a + b + carry;carry = sum / 10;sum %= 10;auto cur = new ListNode(sum);cur->next = ans;ans = cur;if (!s1.empty()) {s1.pop();}if (!s2.empty()) {s2.pop();}}return ans;}
};

总结

许多的链表题目都可以用递归来实现。

何时使用递归(笔者的一点点看法)

  1. 能把问题拆解的;
  2. 不用递归,用循环不好解决的;
  3. 递归基数不算太大的(递归次数太多可能挤爆栈);
  4. 明显的 dfs 搜索。

诗情画意

陋室铭 刘禹锡 山不在高,有仙则名。 水不在深,有龙则灵。 斯是陋室,唯吾德馨。 苔痕上阶绿,草色入帘青。 谈笑有鸿儒,往来无白丁。 可以调素琴,阅金经。 无丝竹之乱耳,无案牍之劳形。 南阳诸葛庐,西蜀子云亭。 孔子云:何陋之有?

Leetcode刷题笔记之445. 两数相加Ⅱ相关推荐

  1. Leetcode刷题(1)两数之和

    最好的种树是十年前,其次是现在.歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主  放弃很容易但是坚持一定很酷     我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的 ...

  2. leetCode刷题第一天--求两数之和

    两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使 ...

  3. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

  4. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  5. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  6. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  7. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

  8. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  9. postgre非零相除等于0_LeetCode刷题实战29:两数相除

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. Spark分析之Standalone运行过程分析
  2. Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
  3. 在C#中调用windows API函数
  4. php smtp tls,php – RoundcubePostfix SMTP:SSL例程:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c...
  5. echarts相关的可视化数据
  6. java 模板引擎_Spring Boot 如何快熟整合Thymeleaf模板引擎
  7. jquerymobile页面跳转和参数传递
  8. lua循环,减少不必要的循环
  9. chrome支持的java版本下载_安装Chrome Java插件
  10. ssm教师教学评价系统(ssm教学评价系统教师ssm学生评教系统)JSP网上评教系统jsp评教系统
  11. win7计算机不显示dvd,win7系统不显示光驱盘符的解决方法
  12. book回车键 mac_macbook pro键盘失灵 macbook pro键盘失灵解决办法
  13. 制造主数据集成开发心得
  14. c++卸载工具_卸载软件同时清除软件注册表里面的信息,也许这款软件能够帮助你...
  15. linewidth方法html,HTML canvas lineWidth用法及代码示例
  16. 新加坡亲子游,这些热门景点必须安排上
  17. 计算机专业的男生喜欢你,男生真心喜欢你的五个表现
  18. 基于Docker-compose编排部署sentiment-analyzer情感分析系统(老保姆级讲解-部署)
  19. 手机怎么解除root权限?华为手机root教程
  20. 数据结构(C语言版 严蔚敏著)——树

热门文章

  1. 卸载3dMax2012流程
  2. 评价数据离散度方法(转)
  3. 模板引擎:ftl文件生成word
  4. 酷炫的终端模拟器eDEX-UI
  5. c0000005 Access Violation
  6. ristretto对cofactor1的椭圆曲线(如Curve25519等)的兼容(含Curve25519 cofactor的sage验证)
  7. Deep Upsupervised Cardinality Estimation 解读(2019 VLDB)
  8. There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案
  9. 【无标题】华为ict网络赛道练习题
  10. Create和OnCreate的关系