将无序链表插入有序链表

时间:2011-06-16 06:51:10

标签: c linked-list

我最近遇到了一个挑战,即编写(一个)高效,优雅的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()函数是否有效?对我来说似乎相当大。

1 个答案:

答案 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的所有非空值都是如此。