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 ...
随机推荐
- 交换学生 (Foreign Exchange,UVa10763)
题目描述: 解题思路: 开一个数组,读入一次交换两个数,如果最后数组不变,即符合匹配 #include<iostream> #include<cstdio> #include& ...
- jQuery 调用后台方法(net)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...
- 5.hadoop常用命令
1. 单独启动和关闭hadoop服务 启动名称节点 #hadoop-daemon.sh start namenode 启动数据节点 #hadoop-daemons.sh start datanode ...
- Twaver的mono-desiner导出的json文件解析
以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...
- 软件工程第四周作业-PSP
psp表格 类别 内容 开始时间 结束时间 中断时间 delta时间 学习 学习C# 10.6下午7:00 10.6下午8:00 - 60min 写代码 写主函数以及一些小的方法 10.7下午2:00 ...
- Android中Parcelabel对象的使用和理解
1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...
- winform Form窗体和UserControl用户空间嵌入Panel容器并填充
private void sbtbflList_Click(object sender, EventArgs e) { ucxmflList ucfl = new ucxmflList();//用户控 ...
- 3ds Max学习日记(二)
搞了一天终于把第二章弄完了,虽然有点慢,但也是没有办法,毕竟中途学累了总得放松一下吧. 又get到了一个新知识点,是关于3ds max的捕捉工具的,详情见3DS MAX 学习笔记 一(捕捉工具 ...
- 载入其他同名源文件导致vs编译错误
今天下午工程编译的时候总是通不过,提示1,某个类没有某个成员,可是我去该类的头文件下查看,确实包括了这个成员啊.2,没有某个类,可是我明明定义了的. 检查了好久才发现 原来是,我打开了其他工程下的某一 ...
- JSON字符串书写
{ "XXX公司": [ { "name": "IT部", "mebers": [ { "维护人员&quo ...