LeetCode删除排序链表重复元素:旧策略失效原因及修复咨询
旧策略失效原因及修复方案
失效原因分析
你的旧代码存在两个核心问题:
- 未切断新链表与原链表的残留连接
你直接将原链表节点挂到新链表时(curr.next = head),只是复制了节点引用,原节点的next指针仍指向原链表的后续节点。比如测试用例[1,1,2,3,3],最后添加的第一个3节点,其next原本就指向第二个3,循环结束后这个连接未被切断,导致输出多了一个3。 - 虚拟节点初始值冲突
你尝试添加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
相关产品推荐
相关产品推荐

