鉴于此方法:
mergeSorted(struct ListNode * a, struct ListNode * b) {
struct ListNode * result = NULL;
if (a == NULL) return b;
if (b == NULL) return a;
if (a->data <= b->data) {
result = a;
result->next = mergeSorted(a->next, b);
}
else {
result = b;
result->next = mergeSorted(a, b->next);
}
return result;
}
我理解列表如何排序,除了它将struct结果设置为NULL的第一行。每次递归调用该方法时,结果列表如何不设置回NULL?我的第一个想法是指针被设置为NULL而不是列表本身的实际内容,但这仍然没有让我自己完全理解。感谢您的帮助!
答案 0 :(得分:0)
'result'在函数中定义。它不会影响此函数的其他迭代,这些迭代在其本地范围内具有“结果”。
每次函数返回时,它会将'result'的本地内容附加到调用函数的'result'结尾。
result->next = mergeSorted(..);
这个递归返回/追加构建了整个排序列表,并最终从最初调用它的位置返回。
答案 1 :(得分:0)
为一个新的struct listnode指针赋予NULL赋值,该指针返回结果而不是传入的值,并且该新指针不触及该函数的上一次迭代中的结果指针。创建和NULL赋值(这是一个范围事物,新指针具有相同的名称但不是同一个指针,因为它存在于一个全新的范围内)。
发生的事情是:
在每个递归级别,结果结构只有一个值,直到递归结束并开始解开,这导致每个级别的递归将其结果报告给先前的迭代结果结构,直到您到达原始调用。 / p>
我唯一感到好奇的是这个递归实际上是如何结束的,我没有看到任何理由这个东西会在它处理的每个结构被消耗之后停止运行(除非设置struct result = struct a以某种方式消耗所有a中的数据并使其为NULL,我不再熟悉C结构了。)