我现在对此非常恼火。我正在学习univeristy的合并排序,我正在网上找到merge sort。但是,我似乎没有得到重复,我想要重复。它的这一点如下,但我已经评论了一点点和东西,它使得排序不能正常工作。有什么办法可以保留重复的内容吗?如果你能让答案变得简单,我会很感激。谢谢
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 :(得分:1)
我认为线索在代码的注释中:“确保你跳过两个”。通过递增两个列表指针,您将向输出添加一个元素,但跳过两个输入元素。所以只增加一个指针。然后,另一个元素将在下一次迭代时移动到输出列表中。
答案 1 :(得分:1)
如果要保留重复项,请将两者都添加到链接列表c
。现在,您只需将一个(即a
或b
)附加到链接列表中。
所以将代码更改为:
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
将指向列表的末尾,并且该算法实际上正在修改a
和b
节点的指针(即,c
不是具有新节点的新链接列表。)
答案 2 :(得分:1)
您可以消除第三种情况(代码中列出的当前其他阻止),并将第二种情况从a > b
更改为else
- 它现在将处理a >= b
的任何情况},并始终将a
放在排序列表中。