方法一:双指针求解
1、设置一个指针cur指向表头(为了解决表头就是重复元素的情况);
2、若cur->next与cur->next->next是重复元素,将cur->next向后移动直到指向不等于该元素的结点。
时间复杂度:o(n)
空间复杂度:o(1)
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//特殊情况处理
if (head == nullptr || head->next == nullptr)
return head;
//设置表头
ListNode* res = new ListNode(0);
res->next = head;
ListNode* cur = res;
while (cur->next->next && cur->next) {
if (cur->next->val == cur->next->next->val) {
int temp = cur->next->val;
while (cur->next->val == temp && cur->next != nullptr)
cur->next = cur->next->next;
} else {
cur = cur->next;
}
}
return res->next;
}
};
方法二:哈希表求解
利用哈希表找到重复的元素,删除重复元素的结点
时间复杂度:o(n)
空间复杂度:o(n)
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
//特殊情况处理
if (head == nullptr || head->next == nullptr)
return head;
unordered_map<int, int> map;
ListNode* cur = head;
//遍历链表统计每个节点值出现的次数
while (cur != nullptr) {
map[cur->val]++;
cur = cur->next;
}
//设置表头
ListNode* res = new ListNode(0);
res->next = head;
cur = res;
//删除重复的元素
while (cur->next != nullptr) {
if (map[cur->next->val] != 1) {
cur->next = cur->next->next;
} else {
cur = cur->next;
}
}
return res->next;
}
};

京公网安备 11010502036488号