[Leetcode Week15] Add Two Numbers
Add Two Numbers 题解
原创文章,拒绝转载
题目来源:https://leetcode.com/problems/add-two-numbers/description/
Description
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
Solution
class Solution {
private:
ListNode* copyList(ListNode* listHeadNode) {
if (listHeadNode == NULL)
return NULL;
ListNode* resHeadNode = new ListNode(listHeadNode -> val);
ListNode* resCurNode = resHeadNode;
ListNode* listCurNode = listHeadNode -> next;
while (listCurNode != NULL) {
resCurNode -> next = new ListNode(listCurNode -> val);
resCurNode = resCurNode -> next;
listCurNode = listCurNode -> next;
}
return resHeadNode;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL)
return copyList(l2);
if (l2 == NULL)
return copyList(l1);
bool isOverflow = false;
int curVal = l1 -> val + l2 -> val;
if (curVal >= 10) {
isOverflow = true;
}
ListNode* resHeadNode = new ListNode(curVal % 10);
ListNode* resPreNode = resHeadNode;
ListNode* l1CurNode = l1 -> next;
ListNode* l2CurNode = l2 -> next;
while (l1CurNode != NULL && l2CurNode != NULL) {
curVal = l1CurNode -> val + l2CurNode -> val;
if (isOverflow)
curVal++;
resPreNode -> next = new ListNode(curVal % 10);
isOverflow = (curVal / 10 > 0);
resPreNode = resPreNode -> next;
l1CurNode = l1CurNode -> next;
l2CurNode = l2CurNode -> next;
}
if (l1CurNode == NULL)
resPreNode -> next = copyList(l2CurNode);
else
resPreNode -> next = copyList(l1CurNode);
if (isOverflow) {
if (resPreNode -> next == NULL) {
resPreNode -> next = new ListNode(1);
} else {
while (true) {
if (resPreNode -> next == NULL) {
resPreNode -> next = new ListNode(1);
break;
} else {
curVal = resPreNode -> next -> val + 1;
if (curVal >= 10) {
resPreNode -> next -> val = curVal % 10;
resPreNode = resPreNode -> next;
} else {
resPreNode -> next -> val = curVal;
break;
}
}
}
}
}
return resHeadNode;
}
};
解题描述
这道题可以说解决的是数字相加的问题,但是由于数字的长度不确定,输入的数字可能是现有的内置数据类型无法存储的,所以像题目中给出的方法是,利用链表来记录数字,然后针对链表中的每一个节点的值进行相加。
明确了题目的要求之后,很快就可以清楚,题目最需要解决的问题就是链表边界和相加进位的问题。我的做法算是简单的对特殊情况打补丁。
[Leetcode Week15] Add Two Numbers的更多相关文章
- LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters
LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...
- LeetCode:1. Add Two Numbers
题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...
- [LeetCode] 445. Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- LeetCode 面试:Add Two Numbers
1 题目 You are given two linked lists representing two non-negative numbers. The digits are stored in ...
- LeetCode #002# Add Two Numbers(js描述)
索引 思路1:基本加法规则 思路2:移花接木法... 问题描述:https://leetcode.com/problems/add-two-numbers/ 思路1:基本加法规则 根据小学学的基本加法 ...
- [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现
[LeetCode] Add Two Numbers 两个数字相加 You are given two non-empty linked lists representing two non-ne ...
- [LeetCode] 2. Add Two Numbers 两个数字相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- LeetCode之Add Two Numbers
Add Two Numbers 方法一: 考虑到有进位的问题,首先想到的思路是: 先分位求总和得到 totalsum,然后再将totalsum按位拆分转成链表: ListNode* addTwoNum ...
- LeetCode 2. add two numbers && 单链表
add two numbers 看题一脸懵逼,看中文都很懵逼,链表怎么实现的,点了debug才看到一些代码 改一下,使本地可以跑起来 # Definition for singly-linked li ...
随机推荐
- 【Python】python学习之总结
迭代器: def gen(): a = yield a a = a * yield a for i in gen(): print(i) 创建一个函数,循环体,yield循环到此就返回一个值.调用函数 ...
- MATLAB strcmp
比较两个输入字符串是否相等 c = strcmp(str1,str2)比较字符串 str1 与 str2 ,若完全相等则返回 1 ,不相等返回 0 str1 = 'hello'; str2 = 'he ...
- Xcode开发技巧之code snippets(代码片段)
一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...
- BZOJ4247 挂饰(动态规划)
相当于一个有负体积的背包.显然如果确定了选哪些,应该先把体积小的挂上去.于是按体积从小到大排序,就是一个裸的背包了. #include<iostream> #include<cstd ...
- SPFA判負環
馬上就退役了,時間不足就不多介紹了 反正DFS是會T飛的,BFS就沒關係了qwq #include<cmath> #include<queue> #include<cst ...
- html的body内标签之超链接
一,先来个简单的练练手,target="_blank" 的作用是在新的tab中打开页面.href 是超链接的意思. <!DOCTYPE html> <html l ...
- 关于__name__=='__main__
if __name__=='__main__' : 为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用. 如果是主动执行,则执行.如果是调用的,则不执行主体. 里面存放的可能是一些测 ...
- [USACO06NOV]玉米田Corn Fields 状压DP
题面: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他的 ...
- [ZJOJ2007]时态同步 贪心
不是很懂为什么luogu标签是树形DP,感觉我想的就是一个贪心啊... 随机造几组数据,我们发现贪心的确可以得到最优解,那么为什么呢? 假设将所有时态贪心的调整是对的,那么如果一个节点的各个儿子时态不 ...
- BZOJ4517 & 洛谷4071:[SDOI2016]排列计数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4517 https://www.luogu.org/problemnew/show/P4071 求有 ...