[英]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.