博客挂了挺久,本来是想写点技术相关的,懒癌+技术栈.empty() == true就拖了很久,那就先水篇LeetCode刷题笔记……
Problem Description
82 Remove Duplicates from Sorted List II(Medium)
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
1 |
Input: 1->2->3->3->4->4->5 |
Example 2:
1 |
Input: 1->1->1->2->3 |
Solution
题目要求我们把重复出现的节点全部删除,感觉递归的思路是比较简单的,就是在当前的递归层检测是否有跟第一个节点重复的节点,有就删除,接着继续递归。
1 |
class { |
注意把需要删除的链(即[head, cur])的最后一个节点的next
指针置为nullptr
,否则因为节点的析构是递归的,可能会出现重复删除的情况,对应的报错信息大概是head-use-after-free
。
众所周知,上面的递归版本按理需要额外的线性空间,而常量空间的迭代版本的可读性则会稍微差一点。
1 |
class { |
这里用了start
和end
代表一个重复的区间,当两者不相等证明出现了重复,需要执行delete
操作。
此外,为了简化逻辑,加了个哨兵节点dummy
。一个需要注意的点是循环外还要加上:
1 |
pd->next = nullptr; |
考虑下 1->2->2
的情况,没有把pd->next置空的话,2会被删除两次。
最后,可以看看两者的时空复杂度:
近期评论