如何在C ++中为mergeSort编写合并功能?

问题描述

我正在学习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();
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...