题目
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
有两种解法,一种是迭代,使用双指针,另一种是递归。
双指针就是定义快慢指针,快指针与慢指针指向的值进行比较,如果两个的val相等代表两个元素重复,将慢指针的next指向快指针的next,如果不相等,两个指针都往后移动,直到快指针为空。
递归解法:结束条件时head为null或者head.next为null,递归的返回值代表以head开头的链表是一个有序不重复的链表,所以,如果两个元素重复,最终返回head,如果不重复,继续递归下一个节点;
代码
//快慢指针解法
public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null) return head;
ListNode pre = new ListNode(0);
pre.next = head;
ListNode cur = head.next;
ListNode slow = head;
while(cur!=null){
if(slow.val==cur.val){
//如果相邻的两个节点的值相等,说明是重复元素,慢指针指向的节点的next=他next.next
//之后快指针往后移动
slow.next = cur.next;
cur = cur.next;
}else{
//如果不相等,快指针和慢指针都往后移动
slow = slow.next;
cur = cur.next;
}
}
return pre.next;
}
递归
//递归解法
public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null) return head;
if (head.val == head.next.val){
head = deleteDuplicates(head.next);
}else{
head.next = deleteDuplicates(head.next);
}
return head;
}