一、题目描述
题目一(初级版)
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次。
例如:
给出的链表为1→1→2,返回1→2.
给出的链表为1→1→2→3→3,返回1→2→3.
数据范围:链表长度满足 0≤𝑛≤100,链表中任意节点的值满足 ∣𝑣𝑎𝑙∣≤100
进阶:空间复杂度 𝑂(1),时间复杂度 𝑂(𝑛)
示例1
输入:{1,1,2}
返回值:{1,2}
示例2
输入:{}
返回值:{}
题目二(进阶版)
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.
数据范围:链表长度 0≤𝑛≤10000,链表中的值满足 ∣𝑣𝑎𝑙∣≤1000∣
要求:空间复杂度 𝑂(𝑛),时间复杂度 𝑂(𝑛)
进阶:空间复杂度 𝑂(1),时间复杂度 𝑂(𝑛)
示例1
输入:{1,2,2}
返回值:{1}
示例2
输入:{}
返回值:{}
二、算法思想
两道题都是删除升序链表中重复的元素,对于已经排好序的链表,重复的元素都是相邻的,所以只需要比较这个元素与它所链接的下一个元素的值即可判断是否要删除。
进阶版的题目,第一个开始重复的数字也要删掉,那么就需要比第一题多一个指针(指代重复元素之前的那一个节点)与后面的元素进行链接。
三、代码
题目一(初级版)
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
class Solution:
def deleteDuplicates(self , head: ListNode) -> ListNode:
if not head:
return None
else:
head0=ListNode(0)
head0.next=head
cur=head
if not head.next:
return head
while cur and cur.next:
if cur.val!=cur.next.val:#cur后面的元素不重复
cur=cur.next#一直后移即可
elif cur.val==cur.next.val:
cur.next=cur.next.next
if not cur.next:#cur已经是尾节点
break
return head0.next
题目二(进阶版)
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
class Solution:
def deleteDuplicates(self , head: ListNode) -> ListNode:
if not head:
return None
else:
head0=ListNode(0)
head0.next=head
pre=head0
cur=head
if not head.next:
return head
while cur and cur.next:
if cur.val!=cur.next.val:#cur后面的元素不重复
pre=pre.next
cur=cur.next#一直后移即可
else:#pre还是留在前面
while cur.val==cur.next.val:#cur后面的元素与cur重复
cur=cur.next#只有cur一直移动到重复的最后一个元素
if not cur.next:#cur已经是尾节点
break
pre.next=cur.next
cur=cur.next
return head0.next