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

两个等节点数链表交错合并:首个Python函数失效原因排查

问题分析与解决

第一个函数的核心bug是在保存原链表的后续节点之前,就修改了原节点的next指针,导致后续遍历完全丢失了原链表的节点引用。

具体问题拆解

看第一个函数的关键代码段:

self.head = node1
self.head.next = node2  # 此处直接修改了node1的next指针,将其指向node2
t1 = node1.next  # 此时node1.next已经是node2,t1拿到的是l2的头节点,而非原l1的第二个节点

当你执行self.head.next = node2时,原l1的头节点(3)的next已经被改成了l2的头节点(6),这时候再给t1赋值node1.next,得到的是6而不是原l1的第二个节点2。

后续循环中,t1始终指向l2的节点,完全没机会访问原l1的剩余节点(2、5、8、9),最终导致链表拼接异常,出现你看到的3->6->4这种截断结果。

对比第二个函数的正确逻辑

第二个函数的处理顺序是正确的:先保存原链表的后续节点,再修改头节点的next指针:

self.head=list1.head
curr1=list1.head.next  # 先把原l1的第二个节点(2)保存到curr1
self.head.next=list2.head  # 再修改头节点的next指向l2的头
curr2=list2.head.next  # 保存l2的第二个节点

这种顺序避免了原链表节点引用的丢失,后续循环能正常交替拼接两个链表的所有节点。

修复第一个函数的方法

只需调整代码顺序,先保存原链表的后续节点,再修改头节点的next:

def shuffle_merge(self, l1,l2):
    node1 = l1.head
    node2 = l2.head
    if not node1 and not node2:
        return
    self.head = node1
    # 先保存原链表的后续节点
    t1 = node1.next
    t2 = node2.next
    # 再修改头节点的next指向l2的头
    self.head.next = node2
    temp = self.head.next
    
    while t1 and t2:
        temp.next = t1
        temp = temp.next
        t1 = t1.next
        temp.next = t2
        temp = temp.next
        t2= t2.next

修改后,t1会正确拿到原l1的第二个节点,后续循环就能正常交替拼接两个链表的所有节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:48:26