题目:链表数字相加
问题描述:
给你两个用链表表示的非负整数,其中每个节点包含一个数字。数字以逆序的方式存储,每个节点只能存储一个数字。请将这两个数相加,并以链表的形式返回其和。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:链表 l1 为 2 -> 4 -> 3,链表 l2 为 5 -> 6 -> 4 | |
输出:链表 7 -> 0 -> 8 | |
解释:342 + 465 = 807,因此返回 7 -> 0 -> 8。 |
要求:
- 定义一个链表节点结构体
ListNode,包含一个整数值val和一个指向下一个节点的指针next。 - 实现一个函数
addTwoNumbers,该函数接收两个链表l1和l2作为参数,并返回一个新的链表,表示两个链表数字的和。 - 在
main函数中创建两个示例链表,调用addTwoNumbers函数,并打印结果链表。 - 实现辅助函数
printList用于打印链表,以及deleteList用于释放链表内存。
源代码:
#include <iostream>
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 释放链表内存
void deleteList(ListNode* head) {
ListNode* current = head;
while (current != nullptr) {
ListNode* next = current->next;
delete current;
current = next;
}
}
// 主函数:两个链表数字相加
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0); // 创建一个虚拟头节点
ListNode* current = &dummy;
int carry = 0; // 初始化进位为0
while (l1 != nullptr || l2 != nullptr) {
int x = (l1 != nullptr) ? l1->val : 0;
int y = (l2 != nullptr) ? l2->val : 0;
int sum = carry + x + y;
carry = sum / 10;
current->next = new ListNode(sum % 10);
current = current->next;
if (l1 != nullptr) l1 = l1->next;
if (l2 != nullptr) l2 = l2->next;
}
if (carry > 0) {
current->next = new ListNode(carry);
}
return dummy.next; // 返回结果链表的头节点(跳过虚拟头节点)
}
// 辅助函数:打印链表
void printList(ListNode* node) {
while (node != nullptr) {
std::cout << node->val;
if (node->next != nullptr) {
std::cout << " -> ";
}
node = node->next;
}
std::cout << std::endl;
}
// 示例测试
int main() {
using namespace std;
// 创建第一个链表:2 -> 4 -> 3
ListNode* l1 = new ListNode(2);
l1->next = new ListNode(4);
l1->next->next = new ListNode(3);
// 创建第二个链表:5 -> 6 -> 4
ListNode* l2 = new ListNode(5);
l2->next = new ListNode(6);
l2->next->next = new ListNode(4);
// 相加链表
ListNode* result = addTwoNumbers(l1, l2);
printList(result); // 预期输出: 7 -> 0 -> 8
// 释放内存
deleteList(l1);
deleteList(l2);
deleteList(result);
return 0;
}
运行截图:
1393

被折叠的 条评论
为什么被折叠?



