Keshawn_lu's Blog

Leetcode 面试题 02.01. 移除重复节点

字数统计: 331阅读时长: 1 min
2020/06/26 Share

题目简介:

编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。

示例1:

1
2
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

示例2:

1
2
输入:[1, 1, 1, 1, 2]
输出:[1, 2]

提示:

  1. 链表长度在[0, 20000]范围内。
  2. 链表元素在[0, 20000]范围内。

思路:

首先先设置一个res = head来保存原始的head

然后定义一个哈希表,遍历链表时若第一次遇到节点中的val,则存入哈希表;

否则,则一直删除节点,直至遇到不重复的节点,并把该节点的val存入哈希表

最后返回一开始定义的res即可。

tip:

  • 注意要将删除过程后,此时不重复的节点值存入哈希表中。

代码如下:

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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeDuplicateNodes(ListNode* head) {

if(head == NULL)
return head;

unordered_map<int, int> map;

ListNode* res = head;
map[head -> val]++;

while(head != NULL && head -> next != NULL){

ListNode* next_node = head -> next;

if(!map.count(next_node -> val)){

map[next_node -> val]++;
head = next_node;
}

else{

while(next_node != NULL && map.count(next_node -> val)){

next_node = next_node -> next;
}
if(next_node != NULL)
map[next_node -> val]++; //注意要存入哈希表中

head -> next = next_node;
head = next_node;
}
}
return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: