问题:
您将获得两个代表两个非负数的链表。数字以相反的顺序存储,每个节点包含一个数字。添加两个数字并将其作为链接列表返回。 输入:(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函数使用此函数并终止程序后会发生什么。由" new"分配的内存还会在那儿吗?这个内存泄漏了吗?无论如何要避免这种情况?
答案 0 :(得分:2)
您可以使用delete取消分配使用new分配的内存。
因此,基本上在完成链接列表之后,您可以通过将指针保持为next作为临时变量来迭代它并删除所有节点。
while(list){
temp = list->next;
delete list;
list = temp;
}
是的,如果您在使用存储在内存中的数据完成之后不删除任何程序的已分配内存,那么从技术上来说,它的内存泄漏。程序退出后,内存将被清除。