【发布时间】:2020-01-30 06:54:16
【问题描述】:
我有两个包含不同数量元素的列表,每个列表至少包含一个重复项。我希望在最坏的线性时间内将较小的列表合并到较大的列表中。
我可以通过使用第三个临时列表来解决这个问题,但我特别需要将较小的列表合并到较大的列表中,而不是创建第三个。
这是一个接收列表并使用新列表“temp”合并它们的函数。注意:这使用了自定义列表,但您可以假设插入方法在 STL 版本中的工作方式相同。
void mergeNoDups(const List<Object> & rhs)
{
List<int> temp;
for (const_iterator iter = this->begin(), iter2 = rhs.begin(); iter != this->end() || iter2 != rhs.end();)
{
if((iter != end()) && iter2 == end() || (*iter < *iter2))
{
temp.push_back(*iter);
++iter;
}
else if (*iter == *iter2)
{
++iter2;
}
else if (*iter > *iter2)
{
temp.push_back(*iter2);
++iter2;
}
}
}
给定输入:
list1 = [0 1 2 5 6]
list2 = [3 4 5 7]
list1 应该是:
列表 1 = [0 1 2 3 4 5 6 7]
有什么建议吗?
【问题讨论】:
-
假设您想将一个新元素插入到一个排序列表中,这样结果将是一个线性排序的列表(例如,新元素在正确的位置)时间并创建一个临时列表。你知道怎么做吗?
-
@Beta 这如何转化为这个问题?
-
因为如果您可以找到插入点并插入(或者如果节点已经存在则不插入)一个节点,您需要做的就是一次又一次地做,直到列表合并。请记住在您刚刚插入(或未插入)的节点之后开始寻找新的插入点。