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的更多相关文章

  1. LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters

    LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...

  2. LeetCode:1. Add Two Numbers

    题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...

  3. [LeetCode] 445. Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  4. LeetCode 面试:Add Two Numbers

    1 题目 You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  5. LeetCode #002# Add Two Numbers(js描述)

    索引 思路1:基本加法规则 思路2:移花接木法... 问题描述:https://leetcode.com/problems/add-two-numbers/ 思路1:基本加法规则 根据小学学的基本加法 ...

  6. [LeetCode] 2. Add Two Numbers 两个数字相加 java语言实现 C++语言实现

    [LeetCode] Add Two Numbers 两个数字相加   You are given two non-empty linked lists representing two non-ne ...

  7. [LeetCode] 2. Add Two Numbers 两个数字相加

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  8. LeetCode之Add Two Numbers

    Add Two Numbers 方法一: 考虑到有进位的问题,首先想到的思路是: 先分位求总和得到 totalsum,然后再将totalsum按位拆分转成链表: ListNode* addTwoNum ...

  9. LeetCode 2. add two numbers && 单链表

    add two numbers 看题一脸懵逼,看中文都很懵逼,链表怎么实现的,点了debug才看到一些代码 改一下,使本地可以跑起来 # Definition for singly-linked li ...

随机推荐

  1. [STL] vector基本用法

    vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩 ...

  2. [LOJ2538] [PKUWC2018] Slay the Spire

    题目链接 LOJ:https://loj.ac/problem/2538 Solution 计数好题. 首先可以发现这题和期望没关系. 其次对于手上的一套牌,设我们有\(a\)张强化牌,那么: 如果\ ...

  3. [洛谷P3627][APIO2009]抢掠计划

    题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...

  4. [HNOI2010]合唱队 区间DP

    ---题面--- 题解: 偶然翻到这道题,,,就写了. 观察到一个数被插在哪里只受前一个数的影响,如果明确了前一个数是哪个,那么我们就可以确定大小关系,就可以知道当前这个数插在哪里,而上一个插入的数就 ...

  5. BZOJ4200 & 洛谷2304 & UOJ132:[NOI2015]小园丁与老司机——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4200 https://www.luogu.org/problemnew/show/P2304 ht ...

  6. 【线性DP】【lgP1336】最佳课题选择

    传送门 Description Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具 ...

  7. git fatal: 拒绝合并无关的历史的错误解决

    本地初始化的项目 与 github 版本不一致, 导致无法提交 $ git pull origin master 来自 https://github.com/itaken/python-login-d ...

  8. c# 合并两个有序数组

    , , , , , }; , , , }; ArrayList lists = new ArrayList(); ArrayList temp = new ArrayList(); lists.Add ...

  9. mysql 修改max_connections

    1.使用命令show variables 来查看当前最大连接数 show variables like '%max_connections%'; 使用命令set global max_connecti ...

  10. 【算法日记】2.算法中的大O符号

    大O符号是一种算法复杂度的相对表示方式. 1.大O表示算法的操作数,表示出算法运行的快慢 2.大O表示法指出了最糟糕情况下的运行时间,例如 简单查找的运行时间O(n),意味着在最糟糕的情况下,必须运行 ...