文章目录
- 题目链接
- 题目描述
- 解题思路
- 代码
- Python
- Java
- C++
- 时空复杂度
 
- 华为OD算法/大厂面试高频题算法练习冲刺训练
题目链接
LeetCode83、删除排序链表中的重复节点
题目描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:

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

输入:head = [1,1,2,3,3]
 输出:[1,2,3]
提示:
- 链表中节点数目在范围 [0, 300]内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
解题思路
已知某个链表节点为cur,删除其下一个节点cur.next(不为空节点)的方法为
cur.next = cur.next.next
由于当前链表已经排序,因此具有相同值的节点在链表中一定是连续排布的。对于任意的当前节点cur,需要判断cur和下一个节点cur.next的关系。若
- cur.next不为空,且两者的值相等即- cur.val == cur.next.val,则需要删除- cur.next
- cur.next为空,或cur.next不为空但两者的值不相等即- cur.val != cur.next.val,则- cur需要前进到- cur.next的位置。
代码
Python
# 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: ListNode) -> ListNode:cur = head      # 头节点不可能被删除,因此无需设置哑节点# 当当前节点cur不为空时持续进行循环遍历while(cur):cur_val = cur.val# 若下一个节点cur.next不为空且值和当前值相等,则删除while(cur.next and cur.next.val == cur_val):cur.next = cur.next.next# 所有和cur的值重复的节点删除完毕之后,才令cur前进cur = cur.nextreturn head
Java
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
public class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode cur = head;while (cur != null) {int curVal = cur.val;while (cur.next != null && cur.next.val == curVal) {cur.next = cur.next.next;}cur = cur.next;}return head;}
}
C++
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode* cur = head;while (cur) {int curVal = cur->val;while (cur->next && cur->next->val == curVal) {cur->next = cur->next->next;}cur = cur->next;}return head;}
};
时空复杂度
时间复杂度:O(N)。仅需一次遍历链表
空间复杂度:O(1)。
华为OD算法/大厂面试高频题算法练习冲刺训练
-  华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸! 
-  课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化 
-  每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果! 
-  60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁 
-  可上全网独家的欧弟OJ系统练习华子OD、大厂真题 
-  可查看链接 大厂真题汇总 & OD真题汇总(持续更新) 
-  绿色聊天软件戳 od1336了解更多