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

递归拆分迭代合并的链表归并排序返回错误结果,求排查方案

链表归并排序问题修复说明

问题根因

你的代码错误出在两个有序链表的合并逻辑:

  • 没有维护已合并链表的尾指针,每次只将当前较小节点指向另一链表的头部,没有和之前已合并的节点建立链接,导致部分节点被直接丢弃(你测试用例里的4、5就是这么丢失的)
  • 循环结束后没有将未遍历完的剩余链表段直接接到合并结果尾部,极端场景会丢失后半段数据

修复后的完整代码

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/

ListNode* Solution::sortList(ListNode* A) {
    ListNode * head = A;
    if(!head || !head->next)
    {   
        return head;
    }
    // 快慢指针找中点拆分逻辑无问题
    ListNode * slow = head, * fast = head;
    while(fast->next && fast->next->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    ListNode * right = slow->next;
    slow->next = NULL;

    ListNode* leftSorted = sortList(head);
    ListNode* rightSorted = sortList(right);

    // 合并逻辑修复:引入哑节点简化边界处理
    ListNode dummy(0);
    ListNode* tail = &dummy;
    while(leftSorted && rightSorted)
    {
        if(leftSorted->val < rightSorted->val)
        {
            tail->next = leftSorted;
            leftSorted = leftSorted->next;
        }
        else
        {
            tail->next = rightSorted;
            rightSorted = rightSorted->next;
        }
        tail = tail->next; // 已合并链表尾指针后移
    }
    // 拼接剩余未遍历的节点
    tail->next = leftSorted ? leftSorted : rightSorted;
    return dummy.next;
}

原有合并逻辑错误复现(以你给出的测试用例为例)

你的测试输入拆分到合并阶段会得到两个有序链表[3,4,5]和[1,2,6],用原有逻辑执行时:

  1. 初始head=3、temp=1,ans被赋值为1,temp移动到2,1的next设为3
  2. 下一轮判断3>2,ptr=2,temp移动到6,2的next设为3,此时没有将2挂到已合并的节点1后面,1的next仍指向3
  3. 后续遍历4、5节点时,同样没有将节点挂到已合并链表尾部,最终导致4、5节点完全从结果链中丢失,就出现了你得到的错误返回结果。

内容的提问来源于stack exchange,提问作者At-U

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:15:03