1.题目描述

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

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

进阶:

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

示例:

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

  

2.解法一:反转链表

2.1 思路

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

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

2.2 代码

class Solution {
public: //反转链表
ListNode* reverseList(ListNode* l3) {
if (!l3) return NULL; ListNode* r = new ListNode(l3->val);
ListNode* h = r;
ListNode* cur = l3->next;
while (cur) {
ListNode* temp = new ListNode(cur->val);
temp->next = h;
h = temp;
cur = cur->next;
}
return h;
} ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { //逆序
l1 = Solution::reverseList(l1);
l2 = Solution::reverseList(l2); unsigned int carry = ; //进位 ListNode* Hl3 = new ListNode();
ListNode* l3 = Hl3; int a = ;
int b = ;
int temp = ; while (l1 != NULL || l2 != NULL)
{
//判断a和b的取值
if (l1 == NULL) a = ;
else a = l1->val;
if (l2 == NULL) b = ;
else b = l2->val; temp = (a + b + carry) % ; //有无进位
if ((a + b + carry) / != )
carry = ;
else
carry = ; //创建新结点,保存temp
l3->next = new ListNode(temp);
l3 = l3->next; if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
} //最后的进位
if (carry == ) {
l3->next = new ListNode();
} //还原链表
Hl3->next = Solution::reverseList(Hl3->next);
return Hl3->next;
}
};

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

3.1 思路

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

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

3.2 代码

#include <iostream>
#include <stack> using namespace std; 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;
stack<int> s2;
stack<int> s3; ListNode* Hl3 = new ListNode();
ListNode* l3 = Hl3; //遍历两个链表入栈,进行逆序
while (l1 != NULL) {
s1.push(l1->val);
l1 = l1->next;
}
while (l2 != NULL) {
s2.push(l2->val);
l2 = l2->next;
} //用栈来相加
int a = ;
int b = ;
int temp = ;
int carry = ; while (!s1.empty() || !s2.empty()) {
a = s1.size() == ? : s1.top();
b = s2.size() == ? : s2.top();
temp = a + b + carry; //有无进位
carry = temp / == ? : ; s3.push(temp % ); /*---常见错误总结---*/
//不空,才能出栈
if(!s1.empty()) s1.pop();
if(!s2.empty()) s2.pop();
}
if (carry == )
s3.push(); //恢复顺序
while (!s3.empty()) {
l3->next = new ListNode(s3.top());
l3 = l3->next;
s3.pop();
}
return Hl3->next;
}
}; int main()
{
ListNode* p1 = new ListNode();
ListNode* p2 = new ListNode();
ListNode* p3 = new ListNode();
ListNode* p4 = new ListNode();
p1->next = p2;
p2->next = p3;
p3->next = p4;
p4->next = NULL; ListNode* q1 = new ListNode();
ListNode* q2 = new ListNode();
ListNode* q3 = new ListNode();
q1->next = q2;
q2->next = q3;
q3->next = NULL; Solution test;
ListNode* t1 = test.addTwoNumbers(p1, q1);
while (t1) {
cout << t1->val << endl;
t1 = t1->next;
}
return ;
}

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. mysql中的select语句where条件group by ,having , order by,limit的顺序及用法

    -- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...

  2. [Clr via C#读书笔记]Cp1CLR执行模型

    Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...

  3. gdb超级基础教程

    GDB超级基础教程 为什么叫超级基础呢,因为我被坑了一把.... 编译选项带 -g 就可以在可执行程序中加入调试信息,然后就可以使用gdb去查看了. 使用help命令就可以看到: (gdb) help ...

  4. Hadoop第二课:Hadoop集群环境配置

    一.Yum配置 1.检查Yum是否安装 rpm -qa|grep yum 2.修改yum源,我使用的是163的镜像源(http://mirrors.163.com/),根据自己的系统选择源, #进入目 ...

  5. “Hello World”团队第一周博客汇总

    时间:2017-10-13——2017-10-19 Scrum会议: 会议要求博客:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1 ...

  6. 无法启动mysql服务 错误1067:进程意外中止

    这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...

  7. 对Android体系结构的理解--后续会补充

    1.最底层_硬件 任何Android设备最底层的硬件包括 显示屏, wifi ,存储设备 等. Android最底层的硬件会根据需要进行裁剪,选择自己需要的硬件. 2.Linux内核层 该层主要对硬件 ...

  8. 转 【关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案】

    关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案 目录 关于api-ms-win-crt-runtimel1-1-0dll缺失的解决方案 目录 安装VC redite ...

  9. [Redis]在Windows下的下载及安装

    1.下载 下载地址: https://github.com/MSOpenTech/redis, 下载并解压到特定的目录. 2.启动Redis服务端 CMD -> redis-server.exe ...

  10. SQL SERVER技术内幕之5 表表达式

    表表达式是一种命名的查询表达式,代表一个有效的关系表.可以像其他表一样,在数据处理语句中使用表表达式.SQL Server支持4种类型的表表达式:派生表(derived table).公用表表达式(C ...