我试图理解以下将两个已排序的链接lsit合并为一个已排序的链接列表(取自here)的算法。
我不完全理解这段代码是如何工作的,我很高兴能得到一个解释。
代码:

#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0)

Node* MergeLists(Node* list1, Node* list2)
{
  Node *list = NULL, **pnext = &list;

  if (list2 == NULL)
    return list1;

  while (list1 != NULL)
  {
    if (list1->data > list2->data)
      SWAP_PTRS(list1, list2);

    *pnext = list1;
    pnext = &list1->next;
    list1 = *pnext;
  }

  *pnext = list2;
  return list;
}

最佳答案

在begging中有空参数的标准测试,它对应于一个列表为空的基本情况,因此默认情况下另一个列表是有序的。
在这里,writer做了一个技巧,每次下一个项将从指向名为list1的节点的指针中添加时,这发生在以下行:*pnext = list1;,剩下的是理解如何始终从一个列表中添加,这是使用SWAP-PTRS宏完成的,该宏将列表startig与list1处的较低值一起放置。
更新累计后,使用:pnext = &list1->next;找到下一个应更新的节点。它工作的原因也很有趣,因为当前更新的节点已指向list1的当前项,其下一个字段中的值是指向下一个应该更新的位置的指针,通过传递该指针的地址(使用&),我们可以更改下一个项的内容。
这个过程一直持续,直到添加的项目是列表中的最后一个。这里一个有趣的点是,没有边条件,因为移除的项总是来自list1,这意味着list2不能在list1之前为空。当list1的最后一项被添加时,while循环终止,list2的其余部分被添加到结果列表的末尾。

关于c - 了解用于合并两个排序的链表的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31904822/

10-14 14:49