@labuladong
思想:快慢指针,慢走1,快走2,快指针结束时,慢指针刚好是中间位置。
边界控制:本题要求若有两个中间数,取后者
感觉边界的问题没有固定的想法,目前觉得模拟虽然有点费时但算准确且不会绕进去,大家有什么更好的方法也留言告诉我下......
class Solution {
public ListNode middleNode(ListNode head) {
//s走一步,f走两步,即f走的路程是s的两倍
ListNode slow = head , fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
1.fast.next != null为了保证fast = fast.next.next;不会抛出异常
2.关于取哪个中间数,可以模拟一下:
s:1 2 3 4 5
f:1 3 5 7 9
当总数为9时,s为5
s:1 2 3 4 5
f:1 3 5 7 null
当总数为8时,s为5
3.若取中间数的前面
s:1 2 3 4 5
f:1 3 5 7 9
则总数为9或10时都要取到5
即fast = 9时不应该再进循环
循环条件应为 fast.next != null && fast.next.next != null