Skip to main content

83. 删除排序链表中的重复元素

思路

从字面意思来看可以直接写出代码

function deleteDuplicates(head: ListNode | null): ListNode | null {
let p1 = head

while (p1) {
if (p1.val === p1.next?.val) {
p1.next = p1.next.next
}
p1 = p1.next
}

return head
}

但是如上代码,如果是三个相等的数字就会出现如下结果

input: [1,1,1]
output: [1,1]
expect: [1]

input: [0,0,0,0,0]
output: [0,0,0]
expect: [0]

可以进行调试, 在第一次循环的时候 p1.next = p1.next.next 得到了 [1,1], 然后执行下一行代码 p1 = p1.next, 也就是 1 = null, null 被赋值给了值是 1 的 p1

然后进行下一轮循环 while(null) 退出循环, 得到结果 [1,1]

第二个 [0,0,0,0,0] 的案例也是同样道理,只会执行一半的去重操作

经过上述描述,p1 = p1.next 这一行代码在跟下一个节点数据一样的时候不应该被执行到,不然就会出现上面的代码, 也就是把这一行代码放到 else 去执行即可

如下代码所示:

function deleteDuplicates(head: ListNode | null): ListNode | null {
let p1 = head

while (p1) {
if (p1.val === p1.next?.val) {
p1.next = p1.next.next
} else {
p1 = p1.next
}
}

return head
}

复杂度分析

时间复杂度: O(N) ,因为就一个 while 循环体

空间复杂度: O(1), 因为没有额外的变量存储, 就一个 let p = head , 没有任何的线性增长数据