题目
数组自写:
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
int[] num=new int[20000];
for(int i=0;i<20000;i++) num[i]=0;
ListNode dummy=new ListNode(-1);
dummy.next=head;
ListNode pre=dummy;
ListNode cur=head;
if(head==null||head.next==null) return head;
while(cur!=null){
if(num[cur.val]==0){
num[cur.val]++;
pre=pre.next;
cur=cur.next;
}else{
pre.next=cur.next;
cur=cur.next;
}
}
return head;
}
}
时间复杂度:O(N),空间复杂度:O(N)
集合题解:
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if (head == null) {
return head;
}
Set<Integer> occurred = new HashSet<Integer>();
occurred.add(head.val);
ListNode pos = head;
// 枚举前驱节点
while (pos.next != null) {
// 当前待删除节点
ListNode cur = pos.next;
if (occurred.add(cur.val)) {
pos = pos.next;
} else {
pos.next = pos.next.next;
}
}
pos.next = null;
return head;
}
}
时间复杂度:O(N),空间复杂度:O(N)
两重循环,用时间换空间:
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
ListNode ob = head;
while (ob != null) {
ListNode oc = ob;
while (oc.next != null) {
if (oc.next.val == ob.val) {
oc.next = oc.next.next;
} else {
oc = oc.next;
}
}
ob = ob.next;
}
return head;
}
}
时间复杂度:O(N^2),空间复杂度:O(1)