给定一个已排序的链表的头 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
的位置。# 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.next
return head
/**
* 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;
}
}
/**
* 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算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
绿色聊天软件戳 od1336
了解更多