题目来源
题目描述
题目解析
递归
class Solution {
public:
// 定义:删除head重复元素
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
// head为基准, head.next应该执行第一个不等于head.val的节点
// curr为待比较的值
ListNode *curr = head->next;
if(head->val != curr->val){ // 如果不相等
head->next = deleteDuplicates(curr);
}else{
// 如果不相等,找到第一个不等于head.val的值
curr = curr->next;
while (curr != nullptr && curr->val == head->val){
curr = curr->next;
}
head->next = deleteDuplicates(curr);
}
return head;
}
};
利用排序链表的排序
指定 cur 指针指向头部 head
当 cur 和 cur.next 的存在为循环结束条件,当二者有一个不存在时说明链表没有去重复的必要了
当 cur.val 和 cur.next.val 相等时说明需要去重,则将 cur 的下一个指针指向下一个的下一个,这样就能达到去重复的效果
如果不相等则 cur 移动到下一个位置继续循环
时间复杂度:O(n)
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;
// 因为我们不知道当前节点元素是否和当前节点的下一个的下一个元素是否相等,所以cur不需要前移
}else{
cur = cur.next;
}
}
return head;
}
}
使用set
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null){
return head;
}
HashSet<Integer> set = new HashSet<>();
ListNode cur = head;
ListNode t = null;
while (cur != null){
if (set.contains(cur.val)){
t.next = cur.next;
cur = cur.next;
}else{
set.add(cur.val);
t = cur;
cur = cur.next;
}
}
return head;
}
}