/**
* 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
*
* 请你将两个数相加,并以相同形式返回一个表示和的链表。
*
* 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
*
*
*
* 示例 1:
*
*
* 输入:l1 = [2,4,3], l2 = [5,6,4]
* 输出:[7,0,8]
* 解释:342 + 465 = 807.
* 示例 2:
*
* 输入:l1 = [0], l2 = [0]
* 输出:[0]
* 示例 3:
*
* 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
* 输出:[8,9,9,9,0,0,0,1]
*
*
* 提示:
*
* 每个链表中的节点数在范围 [1, 100] 内
* 0 <= Node.val <= 9
* 题目数据保证列表表示的数字不含前导零
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/add-two-numbers
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
auto p = new ListNode(0, l1);
auto q = new ListNode(0, l2);
int tmp = 0;
int r = 0;
while (p != nullptr) {
if (q != nullptr) {
tmp += q->val;
}
int t = (p->val + tmp) / 10;
p->val = (p->val + tmp) % 10;
tmp = t;
// q is over, and has no tmp
if (q == nullptr && tmp == 0) {
break;
}
if (r++ > 10) {
break;
}
// p is over
if (p->next == nullptr) {
// p link q
if (q != nullptr && q->next != nullptr) {
p->next = q->next;
p = p->next;
q = nullptr;
continue;
}
// q is over too, need to add new node
else if (tmp != 0) {
p->next = new ListNode(tmp);
}
// q is over too, no need to add new node
break;
}
p = p->next;
q = q == nullptr ? q : q->next;
}
return l1;
}
};
int main() {
// l1 = [2, 4, 3], l2 = [5, 6, 4]
auto l1 = new ListNode(2, new ListNode(4, new ListNode(3)));
auto l2 = new ListNode(5, new ListNode(6, new ListNode(4)));
Solution s;
auto result = s.addTwoNumbers(l1, l2);
while (result != nullptr) {
cout << result->val;
result = result->next;
}
return 0;
}
LeetCode2. 两数相加
最新推荐文章于 2022-07-31 13:46:01 发布