445. 两数相加 II
Q:

A:
这种题的用例是一定会搞一些很大的数的。long都会溢出,所以我们就不用尝试转数字做加法转链表的方法了。另外直接倒置两个链表再做加法的做法会改变原链表,题干也说了禁止改动原链表。
1.求两个链表长度,如果一长一短,把短的前面加若干个0节点,使得两个链表长度相同。之后对于就递归连接链表。dfs函数参数为前一个结果链表指针pre,当前的两个数据链表指针p1、p2。在函数中首先新建节点与pre相连,之后递归p1、p2的后继链表。dfs函数返回的是进位值,1或0。递归函数的进位值返回后要加在当前节点val上,若有进位继续返回给上级节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==0 and l2==0){
return 0;
}
int len1=0,len2=0;
ListNode* p=l1;
while(p){
++len1;
p=p->next;
}
p=l2;
while(p){
++len2;
p=p->next;
}
p=new ListNode(0);
ListNode* n_head=p;
for(int i=1;i<abs(len1-len2);++i){
ListNode* pre_p=p;
p=new ListNode(0);
pre_p->next=p;
}
if(len1<len2){
p->next=l1;
l1=n_head;
}
else if(len1>len2){
p->next=l2;
l2=n_head;
}
ListNode* res=new ListNode(1); //incase sum of l1 and l2 >9
int c=dfs(res,l1,l2);
if(c==1){
return res;
}
else{
return res->next;
}
}
int dfs(ListNode* pre, ListNode* p1,ListNode* p2){ //return carry
ListNode* cur=new ListNode((p1->val+p2->val)%10);
pre->next=cur;
int carry=(p1->val+p2->val)/10; //carry to be returned
if(p1->next){
if(dfs(cur,p1->next,p2->next)==1){
cur->val=(cur->val+1)%10;
carry=(p1->val+p2->val+1)/10;
}
}
return carry;
}
};
2.用两个栈存两个链表倒序的值。思路是我们做加法是从小位加到大位,故考虑用栈可以方便的倒置位数。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> stack1,stack2;
while(l1){
stack1.push(l1->val);
l1=l1->next;
}
while(l2){
stack2.push(l2->val);
l2=l2->next;
}
ListNode* head=0;
int carry=0;
while(!stack1.empty() or !stack2.empty() or carry){
ListNode* p=new ListNode(carry);
if(!stack1.empty()){
p->val+=stack1.top();
stack1.pop();
}
if(!stack2.empty()){
p->val+=stack2.top();
stack2.pop();
}
if(p->val>9){
p->val=p->val%10;
carry=1;
}
else{
carry=0;
}
p->next=head;
head=p;
}
return head;
}
};
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 ...
- Leetcode 445. 两数相加 II
1.题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. ...
- 力扣 - 445. 两数相加 II
目录 题目 思路 代码实现 题目 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两 ...
- 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 ...
- LeetCode 445. Add Two Numbers II (两数相加 II)
题目标签:Linked List 题目给了我们两个 数字的linked list,让我们把它们相加,返回一个新的linked list. 因为题目要求不能 reverse,可以把 两个list 的数字 ...
- [leetcode]445. Add Two Numbers II 两数相加II
You are given two non-empty linked lists representing two non-negative integers. The most significan ...
随机推荐
- H5_0018:z-index失效的原因
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效. 在CSS中,只能通过代码改变层级,这个属性就是z-index, 要让z-index起作用有个小小前提,就是元素的p ...
- JS添加和删除表格行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Python 3.9.0 首个迭代版本发布了
Python 3.9.0 alpha 1 发布了,这是 3.8 之后的首个 3.9 系列版本. ! 官方没有介绍新特性,也没有添加新模块,但是以下模块有所改进: ast asyncio curses ...
- 聊聊c#字符串拼接
字符串对我编程人员来说是字符串时每天见面的常客,你不认识不熟悉他都不得行,字符串的拼接更是家常便饭,那么在实际开发过程中实现字符串的拼接有哪一些方式呢?咱们一起来聊聊,来交流沟通,学习一波.也许你会说 ...
- 【笔记0-开篇】面试官系统精讲Java源码及大厂真题
背景 开始阅读 Java 源码的契机,还是在第一年换工作的时候,被大厂的技术面虐的体无完肤,后来总结大厂的面试套路,发现很喜欢问 Java 底层实现,即 Java 源码,于是我花了半年时间,啃下了 J ...
- LeetCode 第二题 Add Two Numbers 大整数加法 高精度加法 链表
题意 You are given two non-empty linked lists representing two non-negative integers. The digits are s ...
- JS编解码与Java编解码的对应关系
最近前段在导出数据时会遇到“illegal character”的异常错误,结果发现是在请求地址中请求参数包含了空白字符(其编码为%C2%A0)或者是空格字符(其编码为%20),之前对空格字符情况是做 ...
- 曼孚科技:AI领域3种典型的深度学习算法
深度学习(Deep Learning)是机器学习(Machine Learning)领域中一个新的研究方向,引领了第三次人工智能的浪潮. 本文整理了深度学习领域3种典型的算法,希望可以帮助大家更好地 ...
- ubuntu set up 1 - 网络
r2v has to be replaced.. 1. 官网下载zip版本,下载安装脚本 https://www.r2v.com/chapter_00/install.html https://ins ...
- numpy学习(二)
练习篇(Part 2) 11. Create a 3x3 identity matrix (★☆☆) arr = np.eye(3) print(arr) 运行结果:[[1. 0. 0.] [0. 1 ...