删除链表中的重复结点
思路:
①扫描一遍链表,将重复的结点存储在set容器中。
②再次扫描链表,如果结点值存在于set容器中,则把这个结点删除。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.HashSet;
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
//扫描一遍链表,将重复元素存储在set容器中
if (pHead == null) {
return null;
}
ListNode head = new ListNode(0);
head.next = pHead;
HashSet set = new HashSet<>();
ListNode pre = pHead;
ListNode cur = pHead.next;
while (cur != null) {
if (pre.val == cur.val) {
set.add(cur.val);
}
pre = cur;
cur = cur.next;
}
pre = head;
cur = pHead;
while (cur != null) {
if (set.contains(cur.val)) {
pre.next = cur.next;
cur = cur.next;
}
else {
pre = cur;
cur = cur.next;
}
}
return head.next;
}
}
时间复杂度:HashSet 是基于哈希表实现的,查找效率为 O(1),所以总的效率是 O(n)。
空间复杂度:最坏的情况是存一半结点 O(n/2),最好的情况是一个也不存,O(1)。