一、需求
- 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
二、递归法
2.1 思路分析
- 递归法要完成的任务有两个:①对于重复元素,应当直接略过;②对于非重复元素,建立连接;
- 值得注意的是,为什么这道题能用递归解决?首先看这个方法的功能是返回无重复元素的升序链表,也就是说我们可以定位到原链表中第一个不重复元素,而它的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;