leetcode-83

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次

返回同样按升序排列的结果链表。

示例 2:

image-20210520185954214

1
2
输入:head = [1,1,2,3,3]
输出:[1,2,3]

解法:

先创建一个哑结点,再找一个当前节点cur和一个遍历指针tail,让curtail去循环的比较,如果值相同,则tail遍历到与cur值存储不同的节点,然后让cur节点指向当前的tail节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
dummy = ListNode(next=head)
if head == None:
return None
cur = dummy.next
tail = cur.next

while cur != None:
# flag = 0
# 如果值相等就一直迭代
while tail != None and cur.val == tail.val:
tail = tail.next
# flag = 1

cur.next =tail
cur = tail
return dummy.next

[官方解法](删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)):

由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。

细节

当我们遍历到链表的最后一个节点时,$cur.next$ 为空节点,如果不加以判断,访问 $cur.next$ 对应的元素会产生运行错误。因此我们只需要遍历到链表的最后一个节点,而不需要遍历完整个链表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return head

cur = head
# 存在向后遍历的可能
while cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next # 跳过当前的值
else:
cur = cur.next # 继续向后遍历

return head

作者

bd160jbgm

发布于

2021-05-20

更新于

2021-05-20

许可协议