力扣876_链表的中间结点

题目描述:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点
注:这里的头结点就是第一个结点

解题思路:
本来打算用栈,先把所有结点压入栈中,并记录有多少个结点,然后依次出栈,出一半的结点就能找到中间结点,但是超出了时间限制
其实,用快慢指针能做到O(1)空间复杂度的前提下完美达到O(n)的时间复杂度
快指针fast一次走两个结点,慢指针slow一次走一个结点,待快指针走到结尾时,慢指针刚好走到中间结点
力扣876_链表的中间结点_第1张图片
代码如下:

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

复杂度分析:
时间复杂度:O(N)
空间复杂度:O(1)

你可能感兴趣的:(刷题日记,数据结构,链表,leetcode)