下面是一种更简洁易懂的方式来实现该功能:
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummyHead = new ListNode(0);
ListNode* current = dummyHead;
int carry = 0;
while (l1 || l2 || carry) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10; // 进位
current->next = new ListNode(sum % 10); // 求余数作为当前节点的值
current = current->next; // 移动到下一个节点
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
return dummyHead->next; // 返回链表头节点的下一个节点,即为相加后的链表
}
// 创建链表并输出
void createAndPrintList(int num, ListNode*& head) {
head = NULL;
while (num > 0) {
int digit = num % 10;
num /= 10;
if (!head) {
head = new ListNode(digit);
} else {
ListNode* newNode = new ListNode(digit);
newNode->next = head;
head = newNode;
}
}
// 输出链表数字,按逆序方式输出
cout << "链表:";
ListNode* tempNode = head;
while (tempNode) {
cout << tempNode->val;
tempNode = tempNode->next;
}
cout << endl;
}
int main() {
int num1, num2;
cout << "请输入第一个非负整数:";
cin >> num1;
cout << "请输入第二个非负整数:";
cin >> num2;
ListNode* l1 = NULL;
ListNode* l2 = NULL;
createAndPrintList(num1, l1);
createAndPrintList(num2, l2);
ListNode* result = addTwoNumbers(l1, l2);
// 输出相加后的链表结果
cout << "相加后的链表:";
while (result) {
cout << result->val;
result = result->next;
}
cout << endl;
return 0;
}
这段代码使用了 ListNode
结构来表示链表节点,每个节点包含一个值和指向下一个节点的指针。函数 addTwoNumbers
接受两个链表头节点作为参数,并返回相加后的链表头节点。
在 main
函数中,用户输入两个非负整数,然后将它们分别转换成逆序存储的链表。通过调用 addTwoNumbers
函数计算两个链表的和,并输出结果。
希望以上代码能够帮助你理解并实现题目所需功能。
内容由零声教学AI助手提供,问题来源于学员提问