原题描述
给你单链表的头结点 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.创建快慢指针。
//快指针走两步
ListNode fast = head;
//慢指针走一步
ListNode slow = head;
2.遍历链表,快指针走两步,慢指针走一步。
//快指针为空时退出循环 链表长度为偶数
while (fast != null) {
// 快指针先走一步
fast = fast.next;
//判断快指针是否为空
if (fast!=null){
// 快指针再走一步
fast = fast.next;
}else {
// 快指针为空是,慢指针就是中间节点 链表长度为奇数
return slow;
}
//慢指针向前走一步
slow=slow.next;
}
//链表长度为偶数 快指针为空是 慢指针为中间节点
return slow;
复杂度
-
时间复杂度: O(n)
-
空间复杂度: O(1)
Code
class Solution {
public ListNode middleNode(ListNode head) {
//快指针走两步
ListNode fast = head;
//慢指针走一步
ListNode slow = head;
//快指针为空时退出循环 链表长度为偶数
while (fast != null) {
// 快指针先走一步
fast = fast.next;
//判断快指针是否为空
if (fast!=null){
// 快指针再走一步
fast = fast.next;
}else {
// 快指针为空是,慢指针就是中间节点 链表长度为奇数
return slow;
}
//慢指针向前走一步
slow=slow.next;
}
//链表长度为偶数 快指针为空是 慢指针为中间节点
return slow;
}
}