1、题目描述
给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
-
链表中节点数目在范围
[0, 300]
内 -
-100 <= Node.val <= 100
-
题目数据保证链表已经按升序 排列
2、解题思路
关键点
-
由于链表是已排序的,所以重复元素必定相邻,这使得我们可以通过一次遍历解决问题
-
我们只保留每个值的第一个出现节点,跳过后续的重复节点
-
时间复杂度是O(n),因为我们只遍历链表一次
-
空间复杂度是O(1),因为我们只使用了常数级别的额外空间
单指针遍历
-
边界检查:首先检查链表是否为空,如果是空链表直接返回null。
-
初始化指针:使用一个
current
指针从链表头部开始遍历。 -
遍历链表:
-
比较当前节点(
current
)和下一个节点(current.next
)的值 -
如果值相同,就跳过下一个节点(通过
current.next = current.next.next
) -
如果值不同,就将
current
指针移动到下一个节点
-
-
返回结果:最终返回处理后的链表头节点
static ListNode deleteDuplicates(ListNode head) {
if (head == null) return null; // 如果链表为空,直接返回null
ListNode current = head; // 初始化current指针指向头节点
while (current.next != null) { // 当current的下一个节点不为空时循环
if (current.next.val == current.val) { // 如果当前节点和下一个节点的值相同
current.next = current.next.next; // 跳过下一个节点,直接指向下下个节点
} else {
current = current.next; // 否则,移动current到下一个节点
}
}
return head; // 返回处理后的链表头节点
}