删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
/**
* 方法一:直接法
时间复杂度:O(n)O(n),因为列表中的每个结点都检查一次以确定它是否重复,
所以总运行时间为 O(n)O(n),其中 nn 是列表中的结点数。
空间复杂度:O(1)O(1),没有使用额外的空间。
*/
public static ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while(current != null && current.next != null) {
if(current.next.val == current.val) {
current.next = current.next.next;
}else {
current = current.next;
}
} return head;
}
/**
* 方法二:双指针
* 重复数字多时需要比较很多次,那就直接指向最后一个重复的
*/
public static ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode pre = head;
ListNode cur = head;
while(pre != null) {
if(pre.val != cur.val) {
cur.next = pre;
cur = cur.next;
}
pre = pre.next;
}
//最后需要指向null
cur.next = null;
return head;
}
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(2);
ListNode node4 = new ListNode(2);
ListNode node5 = new ListNode(3);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
ListNode res = deleteDuplicates(node1);
while(res != null) {
System.out.print(res.val + " ");
res = res.next;
}
}