LeetCode83. 删除排序链表中的重复元素:迭代+递归解法
题意
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3
题解
迭代方法
由于链表是升序的,所以重复的元素一定相邻着出现,那么判断是否重复,只需要通过比较当前节点是否和上一个节点值相同即可,若相同,则让上一个节点的next指向当前节点的next,来删除当前重复元素;若不相同则无需删除,继续向后迭代。
//迭代方法
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null)return null;
ListNode pre=head,cur=pre.next;
while(cur!=null){
if(pre.val==cur.val)//说明重复
pre.next=cur.next;
else
pre=cur;
cur=cur.next;
}
return head;
}
}
递归方法
递归方法也很简单,deleteDuplicates方法可以处理当前链表,使得其没有重复元素,那我们可以在deleteDuplicates方法中通过自身来处理子链,然后判断链表头节点是否和子链重复,不重复则,让头节点连接子链,然后返回头节点;若重复则直接返回子链头节点。再考虑边界,不论什么样的链表我们都先处理它的子链,那不断的处理子链,直到子链为空,此时为空的子链去重后还是空,所以我们返回空值就好。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null)return null;
head.next=deleteDuplicates(head.next);
if(head.next==null)return head;
return head.val!=head.next.val?head:head.next;
}
}
