LeetCode From Easy To Hard No11[Easy]Middle of the Linked List 求链表的中间节点[快慢指针]

Given a non-empty, singly linked list with head node head, return a middle node of linked list.

If there are two middle nodes, return the second middle node.

 

Example 1:

Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
The returned node has value 3.  (The judge's serialization of this node is [3,4,5]).
Note that we returned a ListNode object ans, such that:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL.

Example 2:

Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
Since the list has two middle nodes with values 3 and 4, we return the second one.

 

Note:

  • The number of nodes in the given list will be between 1 and 100.

题目大意是给出一个链表,求链表的中间节点,如果链表的长度为偶数,中间节点有两个,则返回中间第二个节点。

 

思路:循环链表节点,得到链表长度后,取长度中间值,然后再从头开始循环链表直到达到中间值

class Solution {
    class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

    }
    public ListNode middleNode(ListNode head) {
        if (head == null) {
            return null;
        }
        // 获取链表的长度
        int len = 0;
        ListNode current = head;
        // 循环链表节点,得到链表长度
        while (current != null) {
            len++;
            current = current.next;
        }

        // 重置current节点,从头节点开始
        current = head;
        // 得到链表长度后, 取长度中间值,然后再从头开始循环链表直到达到中间值
        for (int i = 0; i < len / 2; i++) {
            current = current.next;
        }
        return current;

    }
    
}

后来看到一些大佬的解法,使用的是双指针中的快慢指针,注释在下边代码中:
 

class Solution {
    class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

    }
    public ListNode middleNode(ListNode head) {
        if (head == null) {
            return null;
        }
        // 慢指针, 快指针
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            // 慢指针走一步
            slow = slow.next;
            // 快指针走两步, 速度是慢指针的两倍,当快指针走到终点时,慢指针刚好走到中间
            fast = fast.next.next;
        }

        return slow;
    }
    
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值