(一)题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
- 题目数据保证列表表示的数字不含前导零
(二)解题代码
VS中编辑代码如下【共4个文件:2个头文件,2个源文件】
提交时只需提交Solution.cpp中内容,main.cpp主要用于测试代码可行性
头文件 ListNode.h
#pragma once
class ListNode
{
public:
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) {};
};
头文件 Solution.h
#pragma once
#include"ListNode.h"
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2);
};
源文件 Solution.cpp
#include "Solution.h"
#include "ListNode.h"
ListNode * Solution::addTwoNumbers(ListNode * l1, ListNode * l2)
{
int l1_temp(0), l2_temp(0);
int sign(0);
ListNode * result_head = new ListNode(-1, nullptr);
ListNode * result = result_head;
while (l1 != nullptr || l2 != nullptr) {
if (l1 != nullptr)
{
l1_temp = l1->val;
l1 = l1->next;
}
else l1_temp = 0;
if (l2 != nullptr)
{
l2_temp = l2->val;
l2 = l2->next;
}
else l2_temp = 0;
int result_temp = l1_temp + l2_temp + sign;
if (result_temp >= 10) {
sign = 1;
result_temp -= 10;
}
else sign = 0;
ListNode *p = new ListNode(result_temp, nullptr);
result->next = p;
result = result->next;
}
if (sign == 1) {
ListNode *p = new ListNode(1, nullptr);
result->next = p;
result = result->next;
}
return result_head->next;
}
源文件 main.cpp
#include <iostream>
#include "Solution.h"
#include "ListNode.h"
using namespace std;
int main()
{
ListNode *l1_head = new ListNode(-1, nullptr); //l1头结点
ListNode *l2_head = new ListNode(-1, nullptr); //l2头结点
ListNode *l1 = l1_head; //l1指向头结点
ListNode *l2 = l2_head; //l2指向头结点
while (true) {
int m(0);
cin >> m;
while (m != -1) {
ListNode *p = new ListNode(m, nullptr);
l1->next = p;
l1 = l1->next;
cin >> m;
}
int n(0);
cin >> n;
while (n != -1) {
ListNode *p = new ListNode(n, nullptr);
l2->next = p;
l2 = l2->next;
cin >> n;
}
break;
}
Solution a;
ListNode* result = a.addTwoNumbers(l1_head->next, l2_head->next);
while (result != nullptr) {
cout << result->val;
result = result->next;
}
return 0;
}