问题描述
给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。
思路
- 设置快慢指针,慢指针一次前进一个节点,快指针一次前进两个节点,当快指针前进到最后一个节点时,慢指针刚好到前一半链表的最后一个。通过这种方法找到前一半链表的最后一个节点。
- 根据奇偶节点总数时fast节点是最后指向末尾节点还是倒数第二个节点来返回slow节点还是slow的下一个节点。
代码
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
if(fast.next != null){
//偶数个节点此时fast指向倒数第二个节点,slow指向中间两个节点的第一个节点
return slow.next;
}else {
//奇数个节点此时fast指向最后一个节点,slow指向中间节点
return slow;
}
/*
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:38.7 MB,击败了75.65% 的Java用户
*/
}
}