快慢指针-lc876链表的中间节点

发布时间 2023-03-24 11:00:25作者: 小傻孩丶儿

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

img

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

img

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
思路:利用快慢指针遍历链表,当快指针走完时,慢支真走到一半既为中间
//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    //如果利用快慢指针



    //若是链表无环 快指针到头,慢指针则是中间
    // 1,2,3,4,5,6,
    // 1,2,3,4,5,6,7   4


    /**
     * 快慢指针
     * @param head
     * @return
     */
    public ListNode middleNode(ListNode head) {
        if(head == null){
            return head;
        }
        ListNode slow = new ListNode();
        ListNode fast = new ListNode();

        slow = fast = head;

        while(fast!=null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
}
//leetcode submit region end(Prohibit modification and deletion)