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

双向链表归并问题:合并未预排序DLists时归并函数功能失效

问题根因
  • 递归逻辑存在数据丢失问题:你在每一层递归中都会新建一个空链表ls,向其中插入1个元素后,直接将下一层递归返回的结果赋值给ls,导致当前层插入的元素被完全覆盖。再加上你写的判断逻辑每次都会优先取ls1的头节点(因为ls1第一个元素9小于ls2第一个元素12,后续ls1剩余头节点5、1、4、3也都小于12),直到ls1被取空后直接返回ls2,最终结果就是ls1的原有顺序拼接ls2的原有顺序,和你给出的实际输出完全匹配。
  • 归并逻辑适用前提不符:你当前写的每次取两个链表头较小值的逻辑,仅支持两个本身已经升序排列的链表的合并。如果你的需求是合并后得到有序链表,要么先对两个输入链表分别做排序再执行归并,要么将两个链表所有元素汇总后统一排序。
修复方案

场景1:仅需合并两个链表所有元素,无需保证顺序

直接修改递归逻辑,避免当前层插入的元素被覆盖即可,修改后的归并函数如下:

DoublyLinkedList MergeSort(DoublyLinkedList &ls1, DoublyLinkedList &ls2)
{
    DoublyLinkedList ls;
    Initial(ls);
    if(isEmpty(ls1))
        return ls2;
    if(isEmpty(ls2))
        return ls1;
    if(ls1.head->data <= ls2.head->data)
    {
        InsertLast(ls, ls1.head->data);
        RemoveFirst(ls1);
    }
    else
    {
        InsertLast(ls, ls2.head->data);
        RemoveFirst(ls2);
    }
    // 不再直接覆盖ls,将递归返回的结果追加到当前ls末尾
    DoublyLinkedList subLs = MergeSort(ls1, ls2);
    DNode *p = subLs.head;
    while(p != nullptr) {
        InsertLast(ls, p->data);
        p = p->next;
    }
    return ls;
}

场景2:合并后需要得到有序链表

你需要先对ls1和ls2分别执行排序,再用上述归并逻辑合并,或者直接把两个链表的所有元素放到同一个链表后执行排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:06:02