有序链表去重只需比较当前节点与下一个节点。值相同就跳过下一个节点,否则向前移动,时间复杂度 O(n)、额外空间 O(1)。

“有序”是算法成立的前提。如果输入无序,相同值不一定相邻,就需要额外的集合记录已见值,或者先排序并承担相应成本。

平方根为什么可以二分

对非负数而言,f(x) = x² 在搜索区间上单调递增,因此可以根据 mid² 与目标值的关系缩小左右边界。

当输入位于 (0, 1) 时,搜索区间不能写死为 [1, x],应使用 [0, max(1, x)]。停止条件也要统一:可以限制迭代次数,或者在 right - left 小于精度时返回中点。

还需要先定义负数行为,是返回 NaN 还是抛出异常。浮点算法没有脱离需求的“绝对正确”,只有明确的输入域和误差上限。

两道题都很短,但它们训练的是同一件事:先找到让算法成立的结构条件,再写循环。