删除链表中的重复元素Ⅱ

一、需求

  • 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

二、递归法

2.1  思路分析

  1. 递归法要完成的任务有两个:①对于重复元素,应当直接略过;②对于非重复元素,建立连接;
  2. 值得注意的是,为什么这道题能用递归解决?首先看这个方法的功能是返回无重复元素的升序链表,也就是说我们可以定位到原链表中第一个不重复元素,而它的next就就可由该方法实现,依次类推,可以将原问题分解为多个子问题;

2.2  代码实现

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode nextNode = head.next;
        if(nextNode.val == head.val) {
            //定位到链表的不重复节点
            while(nextNode != null && nextNode.val == head.val) {
                nextNode = nextNode.next;
            }
            //舍弃重复节点部分
            head = deleteDuplicates(nextNode);  
        } else {
            //连接无重复的节点
            head.next = deleteDuplicates(head.next);
        }
        return head;
    }
}

2.3  复杂度分析

  • 时间复杂度为O(N),需要遍历所有的链表节点;
  • 空间复杂度为O(N),递归的深度最大可达N;

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/113834557
今日推荐