Leetcode 445. 两数相加 II
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的更多相关文章
- LeetCode 445. 两数相加 II(Add Two Numbers II)
445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...
- Java实现 LeetCode 445 两数相加 II
445. 两数相加 II 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会 ...
- LeetCode 445——两数相加 II
1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...
- 力扣 - 445. 两数相加 II
目录 题目 思路 代码实现 题目 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两 ...
- 445. 两数相加 II
Q: A: 这种题的用例是一定会搞一些很大的数的.long都会溢出,所以我们就不用尝试转数字做加法转链表的方法了.另外直接倒置两个链表再做加法的做法会改变原链表,题干也说了禁止改动原链表. 1.求两个 ...
- Leetcode 002. 两数相加
1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- LeetCode 2. 两数相加(Add Two Numbers)
2. 两数相加 2. Add Two Numbers 题目描述 You are given two non-empty linked lists representing two non-negati ...
- 445 Add Two Numbers II 两数相加 II
给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表.你可以假设除了数字 0 之外,这两个数字都不会以零开头.进阶:如果输入链表 ...
- [Swift]LeetCode445. 两数相加 II | Add Two Numbers II
You are given two non-empty linked lists representing two non-negative integers. The most significan ...
随机推荐
- mysql中的select语句where条件group by ,having , order by,limit的顺序及用法
-- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...
- [Clr via C#读书笔记]Cp1CLR执行模型
Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...
- gdb超级基础教程
GDB超级基础教程 为什么叫超级基础呢,因为我被坑了一把.... 编译选项带 -g 就可以在可执行程序中加入调试信息,然后就可以使用gdb去查看了. 使用help命令就可以看到: (gdb) help ...
- Hadoop第二课:Hadoop集群环境配置
一.Yum配置 1.检查Yum是否安装 rpm -qa|grep yum 2.修改yum源,我使用的是163的镜像源(http://mirrors.163.com/),根据自己的系统选择源, #进入目 ...
- “Hello World”团队第一周博客汇总
时间:2017-10-13——2017-10-19 Scrum会议: 会议要求博客:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/1 ...
- 无法启动mysql服务 错误1067:进程意外中止
这个错误在前些周遇到过,没有解决,直接粗暴的卸载重装了,自己用的是wampserver集成环境,重装的后果是mysql里面的一些已有的数据库就没有了,有点小悲剧,不过幸好都是一些测试用的数据库,后面直 ...
- 对Android体系结构的理解--后续会补充
1.最底层_硬件 任何Android设备最底层的硬件包括 显示屏, wifi ,存储设备 等. Android最底层的硬件会根据需要进行裁剪,选择自己需要的硬件. 2.Linux内核层 该层主要对硬件 ...
- 转 【关于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 ...
- [Redis]在Windows下的下载及安装
1.下载 下载地址: https://github.com/MSOpenTech/redis, 下载并解压到特定的目录. 2.启动Redis服务端 CMD -> redis-server.exe ...
- SQL SERVER技术内幕之5 表表达式
表表达式是一种命名的查询表达式,代表一个有效的关系表.可以像其他表一样,在数据处理语句中使用表表达式.SQL Server支持4种类型的表表达式:派生表(derived table).公用表表达式(C ...