题目
存在一个按升序排列的链表,给你这个链表的头节点 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)。
方法2
还可以使用递归来实现,代码比方法1要简洁,当然时间复杂度上是一定会上升的。道理很简单,每处理完一个节点,就意味着需要处理的链表变小,而这个变小的链表在处理上和原链表的处理方式是一模一样的,这就完全可以利用递归来做。
代码
package com.jiawei.linklist;
/**
* ClassName: RemoveDuplicates_83
* Package: com.jiawei.linklist
* Description: (LeetCode-83) 删除排序链表中的重复元素
* 存在一个按升序排列的链表,给你这个链表的头节点 head ,
* 请你删除所有重复的元素,使每个元素 只出现一次 。
* 返回同样按升序排列的结果链表。
*
* @Author JiaWei-L
* @Create 2024/1/17 0:50
* @Version 1.0
*/
public class RemoveDuplicates_83 {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode currentNode = head;
while(null != currentNode.next){
if(currentNode.next.val == currentNode.val){
currentNode.next = currentNode.next.next;
}else {
currentNode = currentNode.next;
}
}
return head;
}
/*递归处理,在本质上其实就是将链表压栈后倒序处理了*/
public ListNode deleteDuplicatesRecursive(ListNode head) {
if(head == null || head.next == null) return head;
head.next = deleteDuplicates(head.next);
return head.val == head.next.val ? head.next : head;
}
}