15. 删除有序链表中重复的元素-I
看到空间复杂度要求就知道不能用set或者数组,因为链表元素本身已经是从小到大,所以每次只要判断和前一个元素不一样即可
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
ListNode cur = head;
ListNode pre = head;
while(cur!=null){
while(cur!=null&&pre.val==cur.val){
cur = cur.next;
}
pre.next = cur;
if(cur!=null) cur = cur.next;//防止越界
pre = pre.next;
}
return head;
}
}
16. 删除有序链表中重复的元素-II
和上一题的不同在于重复出现的元素全部都删除,因为还是升序的,所以依旧用两个指针判断是否重复出现过即可,空间复杂度还是O(1)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
ListNode res = new ListNode(-1);
ListNode res2 = res;
ListNode cur = head;
ListNode pre = head;
int flag = 0;//标记是否重复出现
while(cur!=null){
cur = cur.next;
if(cur!=null&&cur.val!=pre.val||cur==null){
if(flag==0){
res2.next = pre;//没有重复过
res2 = res2.next;
}
pre = cur;//pre指向第一个不同的元素
flag=0;
}
else flag = 1;//重复出现了
res2.next = null;
}
return res.next;
}
}