You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并有序双向链表问题:最后一个元素未加入合并链表

合并有序双向链表的问题修复

你的代码问题出在循环内部逻辑混乱,导致最后一个节点没被处理。具体来说:

  • 原while循环仅在两个指针都不为空时执行,但你在循环里每次处理一个节点后,又额外做了一次插入操作,这不仅会导致重复插入,还会让其中一个指针提前走到末尾,循环直接退出,剩下的节点根本没机会处理。
  • 当左链表遍历完(lptr为空),你只插入了当前rptr的节点并移动指针,但此时循环已经因为lptr为空而结束,剩下的rptr节点(比如20)就被漏掉了。

修正后的代码

template <typename T>
LinkedList<T> LinkedList<T>::merge(const LinkedList<T> &other) const
{
  LinkedList<T> merged;

  Node *lptr = head_;
  Node *rptr = other.head_;

  // 遍历两个链表,依次插入较小的节点
  while (lptr != nullptr && rptr != nullptr) {
    if (lptr->data <= rptr->data) {
      merged.pushBack(lptr->data);
      lptr = lptr->next;
    } else {
      merged.pushBack(rptr->data);
      rptr = rptr->next;
    }
  }

  // 处理左链表剩余的所有节点
  while (lptr != nullptr) {
    merged.pushBack(lptr->data);
    lptr = lptr->next;
  }

  // 处理右链表剩余的所有节点
  while (rptr != nullptr) {
    merged.pushBack(rptr->data);
    rptr = rptr->next;
  }

  return merged;
}

关键修正点

  • 移除了原循环内部多余的插入逻辑,每次循环只做一次比较和插入,保证逻辑清晰。
  • 循环结束后,分别遍历两个链表剩余的节点,一次性把所有剩余节点追加到合并链表末尾,不会遗漏任何节点。
  • 去掉了不必要的原链表复制(left = *this和right = other),直接使用原链表的头指针,减少内存开销。

用你的测试案例验证:左链表[1,3,5],右链表[-1,2,10,20],合并时会依次插入-1、1、2、3、5、10,之后右链表剩下的20会被最后追加进去,得到预期结果。

内容的提问来源于stack exchange,提问作者klixo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:07:35