【程序员面试金典】面试题 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;
    }
};
posted @ 2020-06-08 22:10  Galaxy_hao  阅读(170)  评论(0编辑  收藏  举报