给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
下面是一个用 C++ 实现的示例代码:
#include <iostream>
#include <vector>
using namespace std;
// 链表节点定义
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 反转链表
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* curr = head;
while (curr!= NULL) {
ListNode* nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
// 计算两个链表的和并返回结果链表
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 反转两个链表
ListNode* l1Rev = reverseList(l1);
ListNode* l2Rev = reverseList(l2);
// 初始化结果链表的头节点和进位
ListNode* dummy = new ListNode(0);
ListNode* curr = dummy;
int carry = 0;
// 遍历两个反转后的链表
while (l1Rev!= NULL && l2Rev!= NULL) {
int x = l1Rev->val + l2Rev->val + carry;
carry = x / 10;
curr->next = new ListNode(x % 10);
curr = curr->next;
l1Rev = l1Rev->next;
l2Rev = l2Rev->next;
}
// 如果 l1 还有剩余的数字
while (l1Rev!= NULL) {
int x = l1Rev->val + carry;
carry = x / 10;
curr->next = new ListNode(x % 10);
curr = curr->next;
l1Rev = l1Rev->next;
}
// 如果 l2 还有剩余的数字
while (l2Rev!= NULL) {
int x = l2Rev->val + carry;
carry = x / 10;
curr->next = new ListNode(x % 10);
curr = curr->next;
l2Rev = l2Rev->next;
}
// 删除结果链表的头节点
ListNode* result = dummy->next;
delete dummy;
return result;
}
int main() {
// 示例输入
ListNode* l1 = new ListNode(2);
l1->next = new ListNode(4);
l1->next->next = new ListNode(3);
ListNode* l2 = new ListNode(5);
l2->next = new ListNode(6);
l2->next->next = new ListNode(4);
// 计算两个链表的和
ListNode* sum = addTwoNumbers(l1, l2);
// 打印结果链表
ListNode* curr = sum;
while (curr!= NULL) {
cout << curr->val << " ";
curr = curr->next;
}
cout << endl;
return 0;
}
在这个示例中,我们首先定义了两个链表节点的结构体 ListNode,以及一个用于反转链表的函数 reverseList。然后,我们定义了一个函数 addTwoNumbers,用于计算两个链表的和,并返回结果链表。
在 addTwoNumbers 函数中,我们首先将两个链表进行反转,然后使用迭代的方式将两个反转后的链表的数字逐位相加,并处理进位。最后,我们删除结果链表的头节点,并返回结果链表。
在 main 函数中,我们创建了两个示例链表 l1 和 l2,并调用 addTwoNumbers 函数计算它们的和。最后,我们打印结果链表。