2011-05-01 79 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首先在整理名单。