题目描述:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
我的解题思路:双指针,一个在前一个在后,比较两个指针所代表的链表节点数值是否相同,相同则将快指针继续向后遍历,不同则同时更改两个指针指向位置
public ListNode deleteDuplicates(ListNode head){
if (head == null || head.next == null) {
return head;
}
ListNode left = head;
ListNode right = head.next;
while (right != null) {
if (left.val == right.val) {
right = right.next;
} else {
left.next = right;
left = right;
right = right.next;
}
}
left.next = right;
return head;
}
参考解题思路:思路与上述大体一致,通过一次遍历,不过不需要定义额外指针遍历
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode node = head;
while (node.next != null) {
if (node.val == node.next.val) {
node.next = node.next.next;
} else {
node = node.next;
}
}
return head;
}
复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。
空间复杂度:O(1)。