LeetCode 24题两两交换链表节点代码超时问题排查求助
分析LeetCode 24题交换链表节点代码超时的原因及修正方案
问题根源:逻辑错误导致死循环
你的代码触发超时不是因为未优化,而是逻辑错误形成了循环链表,导致while fast永远无法退出:
- 交换节点时未保存后续节点引用:执行
runner.next.next = slow后,fast的next被指向slow,但slow原本的next还是fast,形成fast ↔ slow的环。后续slow = fast.next会让slow停在原地,fast = slow.next又回到原fast,循环永远无法终止。 - runner指针未正确移动:每次交换完一对节点后,
runner需要移动到当前交换后的第二个节点(原slow),才能衔接下一对节点,但你的代码完全没做这个操作,导致后续节点无法正确挂载。 - 边界条件处理混乱:
if not fast.next:的判断逻辑错误,提前return的时机不对,会遗漏链表长度为奇数等场景。
修正后的代码实现
以下是两种O(n)时间复杂度、O(1)空间复杂度的正确实现:
迭代方式(修正你的思路)
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]: dummy = ListNode(0) dummy.next = head prev = dummy while prev.next and prev.next.next: # 保存要交换的两个节点 first = prev.next second = prev.next.next # 执行交换,先处理后续节点避免断链 first.next = second.next second.next = first prev.next = second # 移动prev到下一对的前一个节点 prev = first return dummy.next
递归方式(更简洁)
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]: # 递归终止条件:无节点或只剩一个节点 if not head or not head.next: return head # 保存第二个节点,递归处理后续链表 second = head.next head.next = self.swapPairs(second.next) # 交换当前两个节点 second.next = head # 返回交换后的头节点 return second
关键要点总结
- 交换节点前必须先保存后续节点的引用,避免断链或形成环
- 迭代方式用哑节点处理头节点交换的特殊情况,通过prev指针跟踪每一对节点的前一个节点
- 递归方式利用递归栈处理后续节点,代码更简洁,常规测试用例下不会出现栈溢出问题
内容的提问来源于stack exchange,提问作者Shahryar
相关产品推荐
相关产品推荐

