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

Python链表节点变量引用及LeetCode代码赋值差异疑问

插入排序链表中last_sorted.next和head.next的区别

本质逻辑差异

先明确插入排序链表的核心思路:我们需要一个last_sorted指针,专门指向已排序部分链表的最后一个节点。初始状态下,整个链表只有头节点是已排序的,所以last_sorted和head指向同一个ListNode对象。

  • 使用curr = last_sorted.next:
    • 初始阶段和curr = head.next拿到的是同一个节点,但随着排序推进,last_sorted会向后移动——当待排序节点刚好处于已排序部分的末尾时,我们会把last_sorted更新为这个节点。此时last_sorted.next会自动指向下一个未排序的节点,保证能逐个处理完所有链表元素。
  • 使用curr = head.next:
    • 仅第一次循环有效,后续head始终固定指向链表头节点,head.next永远是初始的第二个节点,会导致循环陷入死循环或仅处理同一个节点,完全无法完成链表排序。

Python控制台实验验证初始引用一致性

通过以下控制台代码可验证初始时last_sorted与head指向同一个对象:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 创建测试链表:4 -> 2 -> 1 -> 3
head = ListNode(4)
head.next = ListNode(2)
head.next.next = ListNode(1)
head.next.next.next = ListNode(3)

last_sorted = head

# 验证引用一致性
print(head is last_sorted)  # 输出: True
print(head.next is last_sorted.next)  # 输出: True

# 修改last_sorted的next属性,观察head的变化
last_sorted.next = ListNode(5)
print(head.next.val)  # 输出: 5,说明二者指向同一对象,修改属性会互相影响

为什么必须用last_sorted.next

插入排序的核心是逐步扩展已排序区间:

  1. 初始已排序区间:仅包含头节点head
  2. 每次取已排序区间的下一个节点(last_sorted.next)作为待插入节点curr
  3. 将curr插入到已排序区间的正确位置
  4. 若curr恰好位于已排序区间末尾(无需移动),则更新last_sorted为curr,完成已排序区间的扩展

如果改用head.next,每次循环只会获取链表的第二个节点,永远无法推进到后续未排序节点,直接导致排序逻辑失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:16:21