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

我的环形链表拆分代码存在错误,请求排查(GeeksforGeeks算法题)

题目

给定一个大小为N的环形链表,请将其拆分为两个环形链表。若原环形链表的节点数为奇数,则拆分后的第一个链表需比第二个链表多一个节点。最终得到的两个链表必须为环形链表,而非线性链表。

示例

示例1

输入:
环形链表:1->5->7
输出:
1 5

7

示例2

输入:
环形链表:2->6->1->5
输出:
2 6

1 5

我的代码

def splitList(head, head1, head2):
    slow = head
    fast = head
    head1 = head
    while fast.next!=head and fast.next.next!=head:
        slow = slow.next
        fast = fast.next.next
    if fast.next.next == head:
        fast = fast.next
    head2 = slow.next
    fast.next = slow.next
    slow.next = head

代码存在的问题

  1. 参数赋值无法同步到外部:在Python中,函数内对head1和head2的直接赋值只是修改了局部变量,不会改变外部传入的变量。这会导致调用者无法获取到拆分后的两个链表头节点。正确的做法是让函数返回(head1, head2),或者通过可变容器(比如列表)来传递结果。
  2. 奇数节点场景的判断逻辑错误:当链表节点数为奇数时,循环结束后fast.next已经等于head,此时fast.next.next == head的判断永远不成立,导致判断分支无效。实际上只需要检查fast.next != head,如果成立再移动fast到最后一个节点即可覆盖奇偶两种场景。
  3. 单节点边界情况未处理:当原链表只有1个节点时,代码会让两个链表都指向这个节点,不符合拆分要求(虽然题目可能隐含N≥2,但代码需要具备鲁棒性)。

修正后的示例代码

def splitList(head):
    if not head:
        return None, None
    slow = head
    fast = head
    head1 = head
    # 遍历找到中间节点
    while fast.next != head and fast.next.next != head:
        slow = slow.next
        fast = fast.next.next
    # 处理奇数节点的情况,移动fast到最后一个节点
    if fast.next != head:
        fast = fast.next
    head2 = slow.next
    # 拆分并形成两个环
    fast.next = head2
    slow.next = head1
    return head1, head2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:18