2011-05-01 72 views
0

現在我對此感到非常惱火。我正在學習大學合併排序,並且正在通過我在網上找到的這個merge sort。不過,我似乎不會得到重複,我想重複。它的這一點如下,但我已經評論說,有點和東西,它使排序工作不正常。有什麼辦法可以保留重複項?如果你能保持簡單的答案,我將不勝感激。謝謝允許在單獨鏈接列表中對合並排序進行重複C++

else 
{ 
    // Both are equal. 
    // Arbitraritly chose to add one of them and make 
    // sure you skip both! 


    if(c == NULL) 
    { 
     c = a; 
    } 
    else 
    { 
     c->next = a; 
     c = c->next; 
    } 

    a = a->next; 
    b = b->next; 
} 
+0

「我不想重複」。 「有什麼辦法我可以保留重複」。這是什麼? – 2011-05-01 22:04:45

+0

omg haha​​haha im很累很抱歉,我想保留副本lol – 2011-05-01 22:05:23

+0

@Tazzy:好的。那麼你可以編輯你的問題,清楚說明一下嗎? – 2011-05-01 22:06:06

回答

1

我認爲線索是在代碼中的註釋:「確保您跳過這兩者」。通過增加這兩個列表指針,您將添加一個元素到輸出,但跳過兩個輸入元素。所以只增加一個指針。然後,另一個元素將在下一次迭代中移動到輸出列表中。

1

如果要保留重複項,請將兩者都添加到鏈接列表c。現在,您只需將一個(即ab)附加到鏈接列表。

因此改變你的代碼看起來像這樣:

temp_a_next = a->next; 
temp_b_next = b->next; 

if(c == NULL) 
{ 
    c = a; 
    c->next = b; 
    c = b; 
} 
else 
{ 
    c->next = a; 
    c = a; 
    c->next = b; 
    c = b; 
} 

a = temp_a_next; 
b = temp_b_next; 

還要說明一點:與重複排序列表的最後頭將其出發點a,因爲該算法結束c會指向列表的末尾,並且該算法實際上修改了節點ab的指針(即,c不是具有新節點的新鏈接列表)。

1

可以消除第三種情況(代碼中列出的當前else塊),並改變從a > belse第二種情況 - 現在將處理任何情況下a >= b,並始終將a首先在整理名單。