这种用于合并已排序的链接列表的递归方法如何工作?

时间:2015-10-02 15:44:40

标签: list recursion merge sorted

鉴于此方法:

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而不是列表本身的实际内容,但这仍然没有让我自己完全理解。感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

'result'在函数中定义。它不会影响此函数的其他迭代,这些迭代在其本地范围内具有“结果”。

每次函数返回时,它会将'result'的本地内容附加到调用函数的'result'结尾。

result->next = mergeSorted(..);

这个递归返回/追加构建了整个排序列表,并最终从最初调用它的位置返回。

答案 1 :(得分:0)

为一个新的struct listnode指针赋予NULL赋值,该指针返回结果而不是传入的值,并且该新指针不触及该函数的上一次迭代中的结果指针。创建和NULL赋值(这是一个范围事物,新指针具有相同的名称但不是同一个指针,因为它存在于一个全新的范围内)。

发生的事情是:

  • 调用此函数并将结构中的一个元素传递给a和b,
  • 创建一个新指针以保存返回值并指定新指针NULL值
  • 检查a或b是否为NULL,如果其中任何一个为NULL则返回另一个(虽然这可能是函数中的弱点,因为如果BOTH为NULL,它将返回NULL,这可能是也可能不是,这取决于什么发生在功能之外)
  • 该函数然后比较A和B当前listnode的值,并取两者中较小的一个并将其添加到结果结构中。
  • 在此赋值之后,函数将结果结构递增到其下一个元素,并再次使用A和B调用mergeSorted(其中一个将递增到下一个值,具体取决于拉出哪个值以填充结果结构)

在每个递归级别,结果结构只有一个值,直到递归结束并开始解开,这导致每个级别的递归将其结果报告给先前的迭代结果结构,直到您到达原始调用。 / p>

我唯一感到好奇的是这个递归实际上是如何结束的,我没有看到任何理由这个东西会在它处理的每个结构被消耗之后停止运行(除非设置struct result = struct a以某种方式消耗所有a中的数据并使其为NULL,我不再熟悉C结构了。)