一、题目描述
给定一个已排序的链表的头 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
题目数据保证链表已经按升序 排列
二、代码
代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
result = []
l1 = head
list1 = []
# 将链表保存至list1中
while (l1):
list1.append(l1.val)
l1 = l1.next
print(list1)
while len(set(list1)) != len(list1):
for i in range(len(list1) - 1):
if list1[i] == list1[i + 1]:
delete_num = list1[i]
while delete_num in list1:
list1.remove(delete_num)
break
print(list1)
if len(list1) == 0:
head = None
return head
# 将list1转换为单链表
head = ListNode(list1[0], None)
tail = head
for i in range(len(list1) - 1):
node = ListNode(list1[i + 1], None)
tail.next = node
tail = node
return head
三、解题思路
本题解题思路为:
①将链表转换为list列表
②反复查看列表中是否存在重复的元素(采用set方法判断列表长度即可发现列表中是否存在重复元素),如果存在则删除这些重复的元素;
③将处理好的列表再转化为链表,此时注意列表为空的情况,如果列表为空,则需要返回一个空链表。
需要注意的点有:
①判断重复元素是哪一个的时候,由于本题“题目数据保证链表已经按升序 排列”,所以可以通过查看连续的2个元素是否相同就可以判断重复的元素是谁了。
②在删除所有重复的元素时,由于remove方法一次只能删除第一个匹配的元素,所以需要反复调用remove方法(本题解采用while循环)
③最后,在每次删除完一种重复元素时,需要用break结束当前for循环,重新查找新的重复元素,因为删除完元素后,数组长度发生了变化,for循环如果继续下去会导致数组下标溢出。