题目
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3
示例 2:
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
提示:
链表的结点数范围是 [1, 100]
1 <= Node.val <= 100
解题思路
前置知识
快慢指针
原理:
1.定义两个指针从,相同位置开始
2.这两个指针步长不一致,一快一慢,以此来制造一个差值,用来解决一些实际问题
3.一般情况下,快指针的移动步长为满指针的两倍
1.我们使用快慢指针来解决这个问题,首先我们设置一个快指针 fast 和一个慢指针 slow
2.我们让这两个指针去遍历整个链表,快指针一次走两步,慢指针一次走一步,结束条件为
(fast != null && fast.next != null)
3.这时我们的慢指针指向的结点就是我们的中位数,我们直接 return slow
代码实现
class Solution {
public ListNode middleNode(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
测试结果