给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 /** * Definition for singly-linked list. * struct ListNode { * 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) {} * }; */
时间: 2024-04-16 13:28:15 浏览: 110
```cpp
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* curr = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int sum = carry;
if (l1) {
sum += l1->val;
l1 = l1->next;
}
if (l2) {
sum += l2->val;
l2 = l2->next;
}
carry = sum / 10;
ListNode* newNode = new ListNode(sum % 10);
curr->next = newNode;
curr = curr->next;
}
return dummy->next;
}
```
以上是一个可以解决这个问题的 C++ 函数,它的输入是两个 `ListNode*` 类型的指针,分别表示两个非负整数的链表表示形式。函数会返回一个新的链表,表示两个数相加的和。
该函数使用一个虚拟头节点 `dummy` 来简化链表操作。然后使用一个指针 `curr` 来指向当前节点,初始化为虚拟头节点。还有一个变量 `carry` 用来记录进位值,初始为 0。
通过遍历两个链表,将对应位置的节点值相加,并加上进位值。然后根据相加结果创建一个新的节点,并将其连接到当前节点的后面。更新进位值和指针位置,直到两个链表都遍历完或者没有进位值。
最后返回虚拟头节点的下一个节点,即为结果链表的头节点。
注意:在使用完链表后,需要手动释放内存,避免内存泄漏。可以通过循环遍历链表并删除各个节点,或者使用智能指针等方式来管理内存。
阅读全文