【程序员面试金典】面试题 02.01. 移除重复节点
题目
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
- 链表长度在[0, 20000]范围内。
- 链表元素在[0, 20000]范围内。
进阶:如果不得使用临时缓冲区,该怎么解决?
思路
在遍历过程中通过hash表统计元素个数,如果节点是hash表已经存在节点,则删除。
代码
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {
if (!head) return head;
vector<int> hash(20001, 0);
ListNode *p = head->next;
hash[head->val] = 1;
ListNode *pre = head;
while (p) {
if (hash[p->val]) {
pre->next = p->next;
p = p->next;
} else {
hash[p->val] = 1;
pre = p;
p = p->next;
}
}
return head;
}
};