gpt4 book ai didi

c++ - 以下合并排序数组 C++ 代码有什么问题?

转载 作者:行者123 更新时间:2023-11-28 02:36:19 26 4
gpt4 key购买 nike

我一直在用 C++ 实现合并排序数组的问题,并发现我的代码中发生了一些奇怪的事情。所以,这是我的代码。

#include <iostream>
using namespace std;

struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};

class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
if (l1 == NULL)
return l2;
else if (l2 == NULL)
return l1;
else
{
ListNode *head, *p;
ListNode *h1 = l1;
ListNode *h2 = l2;
if (h1->val <= h2->val)
{
ListNode newNode(h1->val);
head = &newNode;
h1 = h1->next;
}
else
{
ListNode newNode(h2->val);
head = &newNode;
h2 = h2->next;
}
p = head;
while (h1 != NULL && h2 != NULL)
{
if (h1->val <= h2->val)
{
ListNode *Node = new ListNode(h1->val);
p->next = Node;
//p = p->next;
h1 = h1->next;
}
else
{
ListNode *Node = new ListNode(h2->val);
p->next = Node;
//p = p->next;
h2 = h2->next;
}
p = p->next;
}
if (h2 != NULL)
{
while (h2 != NULL)
{
ListNode *Node = new ListNode(h2->val);
p->next = Node;
p = p->next;
h2 = h2->next;
}
}
else if (h1 != NULL)
{
while (h1 != NULL)
{
ListNode *Node = new ListNode(h1->val);
p->next = Node;
p = p->next;
h1 = h1->next;
}
}
return head;
}
}
};

int main()
{
ListNode A1(1);
ListNode A2(2);
ListNode A3(3);
ListNode A4(5);
ListNode A5(7);
A1.next = &A2;
A2.next = &A3;
A3.next = &A4;
A4.next = &A5;
ListNode B1(2);
ListNode B2(4);
ListNode B3(6);
ListNode B4(8);
ListNode B5(10);
B1.next = &B2;
B2.next = &B3;
B3.next = &B4;
B4.next = &B5;
Solution solution;
ListNode *x = solution.mergeTwoLists(&A1, &B1);
while (x != NULL)
{
cout << x->val << endl;
x = x->next;
}
return 0;
}

此代码将出现运行时错误。当我在codeblocks中调试的时候,发现在类Solution中一切正常。到了main函数,while循环中,出现了异常! x 在一个循环后指向某个奇怪的地址。我想知道出了什么问题。

最佳答案

此处,在 mergeTwoLists 中:

    if (h1->val <= h2->val)
{
ListNode newNode(h1->val);
head = &newNode;
h1 = h1->next;
}
else
{
ListNode newNode(h2->val);
head = &newNode;
h2 = h2->next;
}

您使用 new 在堆上创建的所有其他节点,但在这里您在堆栈上创建 newNode。它是您正在构建的列表的第一个节点,并且是 mergeTwoLists 的局部变量。当控制传出函数时,第一个节点传出作用域。然后您访问它并在 main 中取消引用它的 next,这是未定义的行为

关于c++ - 以下合并排序数组 C++ 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27309650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com