1.题目描述

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

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

进阶:

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

示例:

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

  

2.解法一:反转链表

2.1 思路

(1)将两个链表反转,就变成了Leetcode上的第二道题目“2.两数相加”;

(2)然后就是一样的思路:题中链表顺序正好是低位到高位,先低位相加,有进位保持,下一位计算加上进位,直到最高位相加,如果有进位,生成新的结点保存。

2.2 代码

  1. class Solution {
  2. public:
  3.  
  4. //反转链表
  5. ListNode* reverseList(ListNode* l3) {
  6. if (!l3) return NULL;
  7.  
  8. ListNode* r = new ListNode(l3->val);
  9. ListNode* h = r;
  10. ListNode* cur = l3->next;
  11. while (cur) {
  12. ListNode* temp = new ListNode(cur->val);
  13. temp->next = h;
  14. h = temp;
  15. cur = cur->next;
  16. }
  17. return h;
  18. }
  19.  
  20. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  21.  
  22. //逆序
  23. l1 = Solution::reverseList(l1);
  24. l2 = Solution::reverseList(l2);
  25.  
  26. unsigned int carry = ; //进位
  27.  
  28. ListNode* Hl3 = new ListNode();
  29. ListNode* l3 = Hl3;
  30.  
  31. int a = ;
  32. int b = ;
  33. int temp = ;
  34.  
  35. while (l1 != NULL || l2 != NULL)
  36. {
  37. //判断a和b的取值
  38. if (l1 == NULL) a = ;
  39. else a = l1->val;
  40. if (l2 == NULL) b = ;
  41. else b = l2->val;
  42.  
  43. temp = (a + b + carry) % ;
  44.  
  45. //有无进位
  46. if ((a + b + carry) / != )
  47. carry = ;
  48. else
  49. carry = ;
  50.  
  51. //创建新结点,保存temp
  52. l3->next = new ListNode(temp);
  53. l3 = l3->next;
  54.  
  55. if (l1) l1 = l1->next;
  56. if (l2) l2 = l2->next;
  57. }
  58.  
  59. //最后的进位
  60. if (carry == ) {
  61. l3->next = new ListNode();
  62. }
  63.  
  64. //还原链表
  65. Hl3->next = Solution::reverseList(Hl3->next);
  66. return Hl3->next;
  67. }
  68. };

3.解法二:不允许反转(进阶)

3.1 思路

关键还是在于逆序结构适应于这种情况。不需要考虑空间复杂性的话,为了方便,使用三个栈

    • 前两个栈s1和s2逆序保存两个链表l1和l2的结点值;
    • 第三个栈s3来保存前两个栈相加的结果,还原链表顺序;

3.2 代码

  1. #include <iostream>
  2. #include <stack>
  3.  
  4. using namespace std;
  5.  
  6. struct ListNode {
  7. int val;
  8. ListNode *next;
  9. ListNode(int x) : val(x), next(NULL) {}
  10. };
  11.  
  12. class Solution {
  13. public:
  14. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
  15. stack<int> s1;
  16. stack<int> s2;
  17. stack<int> s3;
  18.  
  19. ListNode* Hl3 = new ListNode();
  20. ListNode* l3 = Hl3;
  21.  
  22. //遍历两个链表入栈,进行逆序
  23. while (l1 != NULL) {
  24. s1.push(l1->val);
  25. l1 = l1->next;
  26. }
  27. while (l2 != NULL) {
  28. s2.push(l2->val);
  29. l2 = l2->next;
  30. }
  31.  
  32. //用栈来相加
  33. int a = ;
  34. int b = ;
  35. int temp = ;
  36. int carry = ;
  37.  
  38. while (!s1.empty() || !s2.empty()) {
  39. a = s1.size() == ? : s1.top();
  40. b = s2.size() == ? : s2.top();
  41. temp = a + b + carry;
  42.  
  43. //有无进位
  44. carry = temp / == ? : ;
  45.  
  46. s3.push(temp % );
  47.  
  48. /*---常见错误总结---*/
  49. //不空,才能出栈
  50. if(!s1.empty()) s1.pop();
  51. if(!s2.empty()) s2.pop();
  52. }
  53. if (carry == )
  54. s3.push();
  55.  
  56. //恢复顺序
  57. while (!s3.empty()) {
  58. l3->next = new ListNode(s3.top());
  59. l3 = l3->next;
  60. s3.pop();
  61. }
  62. return Hl3->next;
  63. }
  64. };
  65.  
  66. int main()
  67. {
  68. ListNode* p1 = new ListNode();
  69. ListNode* p2 = new ListNode();
  70. ListNode* p3 = new ListNode();
  71. ListNode* p4 = new ListNode();
  72. p1->next = p2;
  73. p2->next = p3;
  74. p3->next = p4;
  75. p4->next = NULL;
  76.  
  77. ListNode* q1 = new ListNode();
  78. ListNode* q2 = new ListNode();
  79. ListNode* q3 = new ListNode();
  80. q1->next = q2;
  81. q2->next = q3;
  82. q3->next = NULL;
  83.  
  84. Solution test;
  85. ListNode* t1 = test.addTwoNumbers(p1, q1);
  86. while (t1) {
  87. cout << t1->val << endl;
  88. t1 = t1->next;
  89. }
  90. return ;
  91. }

Leetcode 445. 两数相加 II的更多相关文章

  1. LeetCode 445. 两数相加 II(Add Two Numbers II)

    445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...

  2. Java实现 LeetCode 445 两数相加 II

    445. 两数相加 II 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会 ...

  3. LeetCode 445——两数相加 II

    1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...

  4. 力扣 - 445. 两数相加 II

    目录 题目 思路 代码实现 题目 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两 ...

  5. 445. 两数相加 II

    Q: A: 这种题的用例是一定会搞一些很大的数的.long都会溢出,所以我们就不用尝试转数字做加法转链表的方法了.另外直接倒置两个链表再做加法的做法会改变原链表,题干也说了禁止改动原链表. 1.求两个 ...

  6. Leetcode 002. 两数相加

    1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  7. LeetCode 2. 两数相加(Add Two Numbers)

    2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...

  8. 445 Add Two Numbers II 两数相加 II

    给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表.你可以假设除了数字 0 之外,这两个数字都不会以零开头.进阶:如果输入链表 ...

  9. [Swift]LeetCode445. 两数相加 II | Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...

随机推荐

  1. 交换学生 (Foreign Exchange,UVa10763)

    题目描述: 解题思路: 开一个数组,读入一次交换两个数,如果最后数组不变,即符合匹配 #include<iostream> #include<cstdio> #include& ...

  2. jQuery 调用后台方法(net)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...

  3. 5.hadoop常用命令

    1. 单独启动和关闭hadoop服务 启动名称节点 #hadoop-daemon.sh start namenode 启动数据节点 #hadoop-daemons.sh start datanode ...

  4. Twaver的mono-desiner导出的json文件解析

    以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...

  5. 软件工程第四周作业-PSP

    psp表格 类别 内容 开始时间 结束时间 中断时间 delta时间 学习 学习C# 10.6下午7:00 10.6下午8:00 - 60min 写代码 写主函数以及一些小的方法 10.7下午2:00 ...

  6. Android中Parcelabel对象的使用和理解

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  7. winform Form窗体和UserControl用户空间嵌入Panel容器并填充

    private void sbtbflList_Click(object sender, EventArgs e) { ucxmflList ucfl = new ucxmflList();//用户控 ...

  8. 3ds Max学习日记(二)

      搞了一天终于把第二章弄完了,虽然有点慢,但也是没有办法,毕竟中途学累了总得放松一下吧.   又get到了一个新知识点,是关于3ds max的捕捉工具的,详情见3DS MAX 学习笔记 一(捕捉工具 ...

  9. 载入其他同名源文件导致vs编译错误

    今天下午工程编译的时候总是通不过,提示1,某个类没有某个成员,可是我去该类的头文件下查看,确实包括了这个成员啊.2,没有某个类,可是我明明定义了的. 检查了好久才发现 原来是,我打开了其他工程下的某一 ...

  10. JSON字符串书写

      { "XXX公司": [ { "name": "IT部", "mebers": [ { "维护人员&quo ...