-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path82RemoveDuplicatesFromSortedListII.cpp
54 lines (48 loc) · 1.5 KB
/
82RemoveDuplicatesFromSortedListII.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
82. Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
// The above solution uses more spaces and time than other algo, but time complexity is still O(n)
// It's more readable and understandable than other algo.
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
unordered_map<int, vector<ListNode*>> mNodes;
vector<int> vValues;
ListNode* pNode = head;
while ( pNode ) {
int val = pNode->val;
vValues.push_back(val);
mNodes[val].push_back(pNode);
pNode = pNode->next;
}
head = NULL;
pNode = NULL;
for (const auto& val : vValues) {
if ( mNodes[val].size() == 1 ) {
if ( pNode == NULL ) {
pNode = mNodes[val][0];
head = pNode;
} else {
pNode->next = mNodes[val][0];
pNode = pNode->next;
}
}
}
if ( pNode ) {
pNode->next = NULL; // Make sure the next of last node points to NULL
}
return head;
}
};