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 ...
随机推荐
- Linux shell unzip和tar 批量解压文件
#!/bin/sh UNTAR="tar -xvf " #unzip all zip files function unzip_all_file() { for i in *.zi ...
- 0级搭建类001-RedHat Enterprise Linux 8 安装(RHEL 8) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- mysql 时间,时间戳,字符串之间相互转换
时间转字符串 date_format(now(),'%Y-%m-%d') 时间转时间戳 unix_timestamp(now()) 字符串转时间 str_to_date('2020-01-19','% ...
- ansi sql 语法 切换为 oracle 语法
语句粘贴到 工作表 打开查询构建器 勾选 创建oracle连接 over sql dev 的语法设置调整,否则表别名会右对齐 下面是 转换后的结果,是不是看得舒服多了
- POJ 1099 Square Ice 连蒙带猜+根据样例找规律
目录 题面 思路 思路 AC代码 题面 Square Ice Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4526 A ...
- How to write a paper in a weekend - by Prof. Pete Carr
Key points: don't procrastinate; review the notes and renew the literature search; determine who you ...
- Mono提供脚本机制(C#绑定C++)
1.下载安装最新版mono,https://www.mono-project.com/ 2.添加头文件路径C:\Program Files\Mono\include\mono-2.0,添加库路径C:\ ...
- 05 部署mysql关系数据库
01 安装Mysql 在官网https://dev.mysql.com/上找到自己需要的版本并执行安装 sudo apt-get install mysql-server-5.7 02 运行和退出 # ...
- 回顾 Monty Hall (三门问题)
一.问题描述 Monty Hall Problem 源于美国的一档电视节目<Let's Make a Deal>,其中Monty Hall 是这个节目的主持人. 节目中有三扇门1.2.3, ...
- hashmap与currentHashMap
hashmap的缺点 多线程不安全,在并发场景下使用时容易出现死循环,脏读问题等 死循环:https://juejin.im/post/5a66a08d5188253dc3321da0 (这篇好点)h ...