LeetCode Python - 82. 删除排序链表中的重复元素 II

目录


题目描述

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:

输入:head = 1,2,3,3,4,4,5

输出:1,2,5

示例 2:

输入:head = 1,1,1,2,3

输出:2,3

提示:

  • 链表中节点数目在范围 0, 300 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

解法

我们先创建一个虚拟头节点 dummy,令 dummy.next=head,然后创建指针 pre 指向 dummy,指针 cur 指向 head,开始遍历链表。

当 cur 指向的节点值与 cur.next 指向的节点值相同时,我们就让 cur 不断向后移动,直到 cur 指向的节点值与 cur.next 指向的节点值不相同时,停止移动。此时,我们判断 pre.next 是否等于 cur,如果相等,说明 pre 与 cur 之间没有重复节点,我们就让 pre 移动到 cur 的位置;否则,说明 pre 与 cur 之间有重复节点,我们就让 pre.next 指向 cur.next。然后让 cur 继续向后移动。继续上述操作,直到 cur 为空,遍历结束。

最后,返回 dummy.next 即可。

时间复杂度 O(n),其中 n 为链表的长度。空间复杂度 O(1)。

python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        dummy = pre = ListNode(next=head)
        cur = head
        while cur:
            while cur.next and cur.next.val == cur.val:
                cur = cur.next
            if pre.next == cur:
                pre = cur
            else:
                pre.next = cur.next
            cur = cur.next
        return dummy.next
        

运行结果

相关推荐
kobe_OKOK_5 小时前
__getattr__和__getattribute__如何用
python
全栈弄潮儿6 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技6 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川6 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸6 小时前
排序算法介绍
python·算法·排序算法
笔墨登场说说6 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
MoRanzhi12037 小时前
第 3 篇 · 数据清洗与特征工程:从问题判定到特征构建
python·pandas·数据清洗·特征工程·缺失值处理·异常值检测·特征编码
longlongzihan7 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
刘科领7 小时前
使用ollama & openweb-ui 本地搭建自己的AI
人工智能·python·ui·ai