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

LeetCode删除排序链表重复元素:旧策略失效原因及修复咨询

旧策略失效原因及修复方案

失效原因分析

你的旧代码存在两个核心问题:

  1. 未切断新链表与原链表的残留连接
    你直接将原链表节点挂到新链表时(curr.next = head),只是复制了节点引用,原节点的next指针仍指向原链表的后续节点。比如测试用例[1,1,2,3,3],最后添加的第一个3节点,其next原本就指向第二个3,循环结束后这个连接未被切断,导致输出多了一个3。
  2. 虚拟节点初始值冲突
    你尝试添加curr.next = None修复第一个问题,但原代码中temp = ListNode()会创建默认val为0的节点。当遇到全为0的链表[0,0,0]时,第一次循环head.val == curr.val(都是0),直接跳过添加逻辑,循环结束后temp.next仍为None,导致输出错误。

修复方案

方案一:修改虚拟节点初始值+循环后切断连接

将虚拟节点初始值设为链表中不可能出现的特殊值(比如None,假设链表元素为整数),同时保留循环结束后的curr.next = None,即可解决两个问题:

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head:
            return None

        # 用None作为虚拟节点初始值,避免和链表元素冲突
        temp = ListNode(None)
        curr = temp
        
        while head:
            if head.val != curr.val:
                curr.next = head
                head = head.next
                curr = curr.next
            else:
                head = head.next
        # 切断新链表与原链表的残留连接
        curr.next = None
        return temp.next

方案二:新建节点而非复用原节点

如果不想处理原链表的连接问题,可以直接新建节点添加到新链表,天然避免残留连接的问题:

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head:
            return None

        temp = ListNode(head.val)
        curr = temp
        head = head.next
        
        while head:
            if head.val != curr.val:
                curr.next = ListNode(head.val)
                curr = curr.next
            head = head.next
        return temp

验证测试

  • 测试用例[1,1,2,3,3]:两个方案均可输出[1,2,3]
  • 测试用例[0,0,0]:两个方案均可输出[0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:06:00