文章目录
一、判断链表是否有环?
可以利用快慢指针进行判断,快指针比慢指针多走一步,最后看会不会相遇
为什么不选择多走两步或者三步?
快慢指针的作用就是为了判断是否有环,我们肯定希望越快判断越好,如果是高倍的话,快指针会很快就进入环中,但是慢指针则会很慢才能到达第一个环,这个过程中,快指针将会在第一个环中无意义的高速移动
选择1 和 2 的组合,这样快慢指针的路程差精确等于环绕一周的长度。因为我们不知道环的周长,所以能够被所有正整数整除的数字就只能是1了,只要速度差是一,那么在一个环中,就一定会相遇。
当然按照这种思想其实选择2,3也是可以的,但是如果再考虑计算机内存执行间接寻址的次数越少越好,因为每一次在链表上的移动,都需要一次对内存的访问,我们肯定希望访问的次数越少越好,所以取 1,2 比 2,3 好些。
二、堆排序的过程
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
建堆过程:
(1)将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点),从左至右,从下至上进行调整。
(2)将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
(3)重新调整结构ÿ