💻 在线刷题 · 全屏 IDE 模式进入刷题模式 →
83. 删除排序链表中的重复元素
题目描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:

输入:head = [1,1,2] 输出:[1,2]
示例 2:

输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序 排列
方法一:一次遍历
我们用一个指针
遍历结束后,返回链表的头节点即可。
时间复杂度
可视化演示
以
head = [1,1,2,3,3]为例,演示一次遍历去重:cur指针逐个比较当前节点与下一节点,值相同则跳过重复节点。蓝色为当前节点,黄色为被比较的下一节点,红色为最终去重结果。点击 ▶ 播放,或逐步操作。
head
→
11
→
22
→
33
→
34
→
当前操作比较/参照已完成已连接目标/结果空节点
初始化 cur = head,cur 指向头节点 1。
1 / 10
java
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode cur = head;
while (cur != null && cur.next != null) {
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}cpp
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* cur = head;
while (cur != nullptr && cur->next != nullptr) {
if (cur->val == cur->next->val) {
cur->next = cur->next->next;
} else {
cur = cur->next;
}
}
return head;
}
};python
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = head
while cur and cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head