题目
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
输入: 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){
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;
}