注:c++完整版代码,参考了评论区大神的方法,主要用于自测验证
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
核心代码有注释,非常便于理解
#include
#include
#include
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
//两数相加
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//创建虚拟表头指针,默认为-1;
ListNode *res = new ListNode(-1);
//指向链表表头的指针,用于返回值
ListNode *cur = res;
ListNode *del = cur;
int carry = 0;
while (l1 || l2 )
{
//l1和l2当前位是否为空,不存在用0补上
int l1val = l1 ? l1->val : 0;
int l2val = l2 ? l2->val : 0;
int sum = l1val + l2val + carry;
carry = sum / 10;
// cur->next保存各位的数值
cur->next = new ListNode(sum % 10);
cur = cur->next;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
//最高位有进位,在最前面补1
if (carry) cur->next = new ListNode(1);
return res->next;
free (del);
}
};
ListNode* createListNode(std::vector vals);
void freeListNode(ListNode* head);
void printListNode(ListNode* head);
int main()
{
auto l1 = createListNode({1, 2, 3});
auto l2 = createListNode({9, 8, 7, 6});
printListNode(l1);
printListNode(l2);
Solution s;
auto sum = s.addTwoNumbers(l1, l2);
printListNode(sum);
freeListNode(l1);
freeListNode(l2);
freeListNode(sum);
return 0;
}
//链表创建
ListNode* createListNode(std::vector vals)
{
//c11新特性, nullptr空指针类型的关键字
ListNode *res = nullptr;
ListNode *last = nullptr;
for(auto val : vals) {
if(last) {
last->next = new ListNode(val);
last = last->next;
}
else {
res = new ListNode(val);
last = res;
}
}
return res;
}
//链表输出
void printListNode(ListNode* head)
{
ListNode* node = head;
while(node) {
std::cout << node->val << ", ";
node = node->next;
}
std::cout << std::endl;
}
//释放内存
void freeListNode(ListNode* head)
{
ListNode* node = head;
while(node) {
auto temp = node->next;
delete node;
node = temp;
}
}