我的环形链表拆分代码存在错误,请求排查(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
代码存在的问题
- 参数赋值无法同步到外部:在Python中,函数内对
head1和head2的直接赋值只是修改了局部变量,不会改变外部传入的变量。这会导致调用者无法获取到拆分后的两个链表头节点。正确的做法是让函数返回(head1, head2),或者通过可变容器(比如列表)来传递结果。 - 奇数节点场景的判断逻辑错误:当链表节点数为奇数时,循环结束后
fast.next已经等于head,此时fast.next.next == head的判断永远不成立,导致判断分支无效。实际上只需要检查fast.next != head,如果成立再移动fast到最后一个节点即可覆盖奇偶两种场景。 - 单节点边界情况未处理:当原链表只有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
相关产品推荐
相关产品推荐

