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. python numpy数据相减

    numpy数据相减,a和b两者shape要一样,然后是对应的位置相减.要不然,a的shape可以是(1,m),注意m要等于b的列数. import numpy as np a = [ [0, 1, 2 ...

  2. 20届的阿里 头条 网易 滴滴 百度 小米等Java面经

    转载连接 个人博客:junxuelian.cn 总结:个人感觉回答面试官问题不必太官方和书面化,腾讯sng招实习被发现照着百度百科念.结果可想而知.用自己的话和理解去回答就好.可能应届生会抱怨设计题, ...

  3. Nodejs第一天-{Nodejs基础 深刻理解浏览器 环境变量 基础语法}

    Nodejs第一天 1.什么是Nodejs ​ Nodejs是一个可以运行(解析)ECMAScript的环境; ​ ECMAScript是规定了一些列的语法 ,这些语法想要解析的执行就需要放在某个环境 ...

  4. Simple Expression

    Description You probably know that Alex is a very serious mathematician and he likes to solve seriou ...

  5. “Hello World!”团队召开的第十二次会议

    今天是我们团队“Hello World!”团队召开的第十二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 2 ...

  6. Where to go from here

    Did you get through all of that content? Congratulations! You've learnt the fundamentals of algorith ...

  7. jspSmartUpload上传下载使用例子

    --------------------------------------------------------------------- ServletUpload.java 上传 package ...

  8. Java中终止正在运行线程

    问题:java 中如何让一个正在运行的线程终止掉? Demo_1: class TT implements Runnable { private boolean flag = true; @Overr ...

  9. (五)final修饰符

    final修饰变量 final修饰符一般用于基本数据类型(int,float)或者不可变对象(String).这时候可以看作常量变量. 但是当final作用于可变数据类型时(数组,一般对象),仅仅表示 ...

  10. 3dContactPointAnnotationTool开发日志(三)

      今天的目的是把obj文件导到场景里.具体将制定路径的obj文件导进去我用的是这个方法.导进去后呈现的是一个黑色的影子.   导入后还想实现一下缩放功能,请看这个方法.缩放实现起来也很简单.   光 ...