问题描述
我正在学习C ++,并尝试编写合并函数,该函数将采用两个已排序的列表并将它们组合为一个已排序的列表。这应该在O(n)时间内运行。下面是我的代码:
LinkedList<T> LinkedList<T>::merge(const LinkedList<T>& other) const {
LinkedList<T> left = *this;
LinkedList<T> right = other;
LinkedList<T> merged;
if (left.size() <= 1) {
return left;
}
else{
while (left.size() > 0 && right.size() > 0){
if (left.front() <= right.front()){
merged.pushBack(left.front());
left.popFront();
}
else {
merged.pushBack(right.front());
right.popFront();
}
}
}
return merged;
}
这是我的测试
Testing merge():
Left List: [(1)(3)(5)] Right List: [(-1)(2)(10)(20)]
Merged: [(-1)(1)(2)(3)(5)]
Expected: [(-1)(1)(2)(3)(5)(10)(20)]
我认为这是因为列表之一为空时,循环停止了。有人可以建议我如何处理吗?非常感谢。
解决方法
在主while循环之后,该循环有条件运行,直到两个数组都包含元素。因此,当其中一个为空时,它将退出,并且其中一个数组可能仍包含剩余的元素。您还需要在外部添加一个while循环,以将其余元素添加到结果数组中。这是示例:
while (left.size() > 0)
{
merged.pushBack(left.front());
left.popFront();
}
while (right.size() > 0)
{
merged.pushBack(right.front());
right.popFront();
}