簡體   English   中英

將無序鏈接列表插入有序鏈接列表

[英]Insert an unordered linked-list into an ordered 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()函數是否有效? 對我來說似乎很大。

在我看來,您的算法只是一次將每個未排序的元素插入到已排序的列表中。 如果您有m未排序和n排序,則基本上可以得到與m * n成正比的運算計數。

如果要創建一個未排序項目的數組,然后對其進行排序( m log m操作),則可以使用合並( m + n操作)來構造新列表。

坦率地說,在m和/或n開始變大之前,差異不一定會變得明顯,但要記住這一點。


順便說一句,我認為您可能還會遇到未排序項目在排序列表末尾所屬的問題。 首先需要進行特殊處理,但是如果將7插入列表{1,2,3} ,則最終將嘗試取消引用NULL,因為current已超出排序列表的末尾( current->data <= src->data對於current 所有非NULL值, current->data <= src->data將為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM