假设有一个长度未知的单链表。我们想找到到尾部有 M 步的节点。
例如,单列表是这样的:(A)->(B)->(C)->(X)->(Y) 和 M = 2。那么输出应该是指向 (C) 的指针。
面对这个测验,我的第一反应是遍历单链表得到长度N。然后第二次遍历单链表,但只向前NM-1步。时间复杂度为 O(n),空间复杂度为 O(1)。
然后,我面临的挑战是找到一种解决方案以单次遍历的方式进行。解决方案是有两个指针。第二个指针比第一个指针落后 M 步。这两个指针以相同的速度向前移动。当第一个指针到达尾部时,第二个指针就是结果。
经过对这个问题的深入思考,我真的不相信第二个“棘手”的解决方案比第一个更好。它是一次遍历,但它也涉及 2*NM 指针分配。
有没有想过这个问题?还有其他真正更快的解决方案吗?