C 将无序链表插入有序链表

C 将无序链表插入有序链表,c,linked-list,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 put

我最近遇到了一个挑战,写一个高效、优雅的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;
}
node*insert(node*dest,node*src)
{
节点*当前=dest;
node*previous=NULL;
//处理零长度目的地列表
如果(dest==NULL){return src;}
//处理把它放在一开始
如果(src->data>=dest->data)
{
src->next=dest;
返回src;
}
//迭代以找到正确的位置
while(当前->数据)
{
先前=当前;
当前=当前->下一步;
}
上一个->下一个=src;
src->next=当前;
返回目的地;
}
节点*insertLL(节点*已排序,节点*未排序)
{
while(未排序!=NULL)
{
节点*next_unsorted=unsorted->next;
排序=插入(已排序、未排序);
未排序=下一个\未排序;
}
返回排序;
}

你们能评论一下我的函数吗?特别是我的insert()函数是否有效?在我看来,它相当大。

在我看来,您的算法只是将每个未排序的元素一次一个地插入到排序列表中。如果
m
未排序且
n
已排序,则基本上会给出与
m*n
成比例的运算计数

若要创建未排序项的数组,然后对它们进行排序(
m log m
operations),则可以使用合并(
m+n
operations)来构建新列表

坦率地说,在
m
和/或
n
开始变大之前,差异不一定会变得明显,但这是需要记住的



顺便说一句,我认为您也可能会遇到问题,未排序的项目属于已排序列表的末尾。开始时有特殊处理,但如果将
7
插入列表
{1,2,3}
,则最终会尝试取消对NULL的引用,因为
current
已从排序列表的末尾运行(
current->data data
对于
current
的所有非NULL值都将为true).

在我看来,您的算法只是将每个未排序的元素一次一个地插入到排序列表中。如果
m
未排序且
n
已排序,则基本上会给出与
m*n
成比例的运算计数

若要创建未排序项的数组,然后对它们进行排序(
m log m
operations),则可以使用合并(
m+n
operations)来构建新列表

坦率地说,在
m
和/或
n
开始变大之前,差异不一定会变得明显,但这是需要记住的


顺便说一句,我认为您也可能会遇到问题,未排序的项目属于已排序列表的末尾。开始时有特殊处理,但如果将
7
插入列表
{1,2,3}
,则最终会尝试取消对NULL的引用,因为
current
已从排序列表的末尾运行(
current->data data
对于
current
的所有非NULL值都将为true).

按顺序排列,您实际上是指按顺序排列吗?因为链表总是按顺序排列的(它们的元素总是按一定的顺序排列)。按顺序排列实际上是指按顺序排列吗?因为链表总是按顺序排列的(它们的元素总是按某种顺序排列)。