2009-06-16 63 views
0

我需要合併兩個雙鏈表,但不是按它們的值(列表不排序)。 我想獲得一個列表,其中包含兩個節點中的所有節點,但是按它們在內存中的顯示順序排列。根據內存位置對兩個鏈表進行排序

也許這個形象可以幫助更多: http://img140.imageshack.us/i/drawing2.png/

是否有任何的算法(最好是一快一),可以做這樣的合併? 也許這有點幫助:

  • 列表的開始節點總是在其他節點之前。
  • 一個列表最多可以有8192個節點。
  • 我知道節點在內存中的位置,因爲這些列表跟蹤大塊內存中的空閒位置(用於內存分配器)。
  • 我用C++工作。

在此先感謝!

+1

您的要求使這個聲音不像一個鏈表。爲什麼節點的上限?爲什麼要分配大塊? – 2009-06-16 15:00:55

+0

這是內存分配器的一部分。一個內存塊有32KB,這個「列表」記錄了這個塊的哪些位置已被釋放(一個用於擁有該塊的線程釋放的對象,一個用於其他線程)。你說得對,這實際上並不是鏈表。一個「節點」是一個單獨的32位數字,下半部分表示Next,上一個上一個,用距離塊開始的距離表示,因爲塊的地址是已知的,所以我不需要存儲真正的指針並保存節點的最大數量是32KB/4個字節= 8192個節點 – 2009-06-16 15:36:48

回答

6

好吧,聽起來好像你沒有使用std::list,所以我會用通用的解決方案。由於您的要求是合併列表,但節點按照存儲器中物理位置的順序排列。您可能只需追加兩個列表,然後按節點地址對節點進行排序。

參見:http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html用於鏈接列表的排序算法。

當排序,而不是比較node1->value < node2->value,只是做(size_t)node1 < (size_t)node2,或東西的性質。

2

「合併」在這裏有點讓人誤解,因爲您只能合併已排序的列表,而您的未排序。

您需要排序,而不是合併。

將指向節點的指針放入向量中。在向量上使用std :: sort,並傳遞一個比較函數,將每個指針轉換爲size_t(我認爲)並比較結果數字。

然後,您可以根據向量中的結果順序重新排列鏈接列表。

+1

Evan的答案是更好的 - 使用列表排序算法而不是創建一個備用向量 – Arkadiy 2009-06-16 15:05:32