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;
    }
}
经验分享 程序员 微信小程序 职场和发展