问题:
您将获得两个代表两个非负数的链表。数字以相反的顺序存储,其每个节点都包含一个数字。将两个数字相加并将其作为链表返回。输入: (2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 0 -> 8
溶液:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode dummy(-1);
int carry = 0;
ListNode *prev = &dummy;
for (ListNode *pa = l1, *pb = l2;
pa != nullptr || pb != nullptr;
pa = pa == nullptr ? nullptr : pa->next,
pb = pb == nullptr ? nullptr : pb->next,
prev = prev->next) {
const int ai = pa == nullptr ? 0 : pa->val;
const int bi = pb == nullptr ? 0 : pb->val;
const int value = (ai + bi + carry) % 10;
carry = (ai + bi + carry) / 10;
prev->next = new ListNode(value);
if (carry > 0)
prev->next = new ListNode(carry);
return dummy.next;
}
解决方案很简单,但我想知道由于所有节点都是用"new"构造的,因此 main 函数使用此函数并终止程序后会发生什么。"新"分配的内存还会在那里吧?这是内存泄漏吗?无论如何要避免这种情况?
您可以使用 delete 来释放分配有 new 的内存。
所以基本上在你完成链表之后,你可以迭代它,并通过将指向next的指针作为临时变量来删除所有节点。
while(list){
temp = list->next;
delete list;
list = temp;
}
是的,如果您在使用完存储在内存中的数据后不删除为任何程序分配的内存,那么从技术上讲,它的内存泄漏。不过,一旦程序退出,内存将被清除。