题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
分析和解答
方法1
分析题目我们可以看到,链表是排好序的,因此重复的元素在链表中出现的位置一定是连续的,所以我们可以这么做。
遍历链表,只要发现当前节点的值和下一个节点的值是一样的,那么下一个节点的值就是重复的,自然就可以从链表中去除。
自然这种方法的时间复杂度:O(n),空间复杂度为O(1)。
代码
public ListNode deleteDuplicates(ListNode head) {
if (head == null){
return null;
}
ListNode listNode = new ListNode();
listNode = head;
while (head.next != null){
if (head.val == head.next.val){
head.next = head.next.next;
}
else{
head = head.next;
}
}
return listNode;
}
方法2
还可以使用递归来实现,代码比方法1要简洁,当然时间复杂度上是一定会上升的。道理很简单,每处理完一个节点,就意味着需要处理的链表变小,而这个变小的链表在处理上和原链表的处理方式是一模一样的,这就完全可以利用递归来做。
代码
public ListNode deleteDuplicates1(ListNode head) {
if (head == null||head.next == null){
return head;
}
head.next = deleteDuplicates1(head.next);
return head.val == head.next.val ? head.next:head;
}