我最近遇到了一个挑战,即编写(一个)高效,优雅的C函数,它将无序链表的内容插入到有序的链表中。
这就是我提出的:
node * insert(node * dest, node * src)
{
node * current = dest;
node * previous = NULL;
//Deal with zero-length destination list
if (dest == NULL) { return src; }
//Deal with putting it at the start
if (src->data >= dest->data)
{
src->next = dest;
return src;
}
//Iterate to find the right position
while (current->data <= src->data)
{
previous = current;
current = current->next;
}
previous->next = src;
src->next = current;
return dest;
}
node * insertLL(node * sorted, node * unsorted)
{
while(unsorted != NULL)
{
node * next_unsorted = unsorted->next;
sorted = insert(sorted, unsorted);
unsorted = next_unsorted;
}
return sorted;
}
你能否批评我的功能 - 尤其是我的insert()函数是否有效?对我来说似乎相当大。
答案 0 :(得分:3)
在我看来,您的算法只是将每个未排序的元素一次一个地插入到排序列表中。如果您对m
未排序且n
排序,则基本上会为您提供与m * n
成比例的操作计数。
如果要创建未排序项的数组然后对它们进行排序(m log m
操作),则可以使用合并(m + n
操作)来构造新列表。
粗暴地说,在m
和/或n
开始变大之前,差异不一定会显现出来,但要记住这一点。
顺便说一句,我认为您也可能遇到未排序项目属于排序列表的 end 的问题。您有一个特殊的处理开始但如果您将7
插入列表{1,2,3}
,您最终会尝试取消引用NULL,因为current
已经运行了已排序的结尾列表(current->data <= src->data
对于 current
的所有非空值都是如此。