方法一:双指针求解
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; } };