题目 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。
进阶:
如果不得使用临时缓冲区,该怎么解决?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci
思路
这题毕竟是简单题目,思路很明确,采用哈希表解决重复问题,而且哈希表的查找时间为O(1),所以最终的时间复杂度只有遍历一遍数组的O(n)。个人的代码如下:
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
unordered_map<int, int> data;
ListNode *curr = head, *last = head;
if (head == NULL || head->next == NULL) {
return head;
}
curr = curr->next;
data.insert(pair<int, int>(last->val, last->val));
while (curr != NULL) {
if (data.find(curr->val) == data.end()) {
data.insert(pair<int, int>(curr->val, curr->val));
last->next = curr;
last = curr;
}
curr = curr->next;
}
last->next = NULL;
return head;
}
};
最后,看了看官解和其他解答,没想到进阶问题根本没有比较出彩的思路,进阶问题只是个时间换空间,采用O(n^2)的暴力方法得到答案。也就是每个数字都遍历一遍之前得到的数组,检查是否已经出现过,仅此而已,没什么实际意义。