[LeetCode] 876. Middle of the Linked List

Easy

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 {
public:
    ListNode* middleNode(ListNode* head) {
      ListNode *dummy = head;
      int len = 0;
      while (dummy) {
         dummy = dummy->next;
         len++;
      }
      len = len / 2;
      while (len > 0) {
         head = head->next;
         len--;
      }
      return head;
  } };

方法二:快慢指针。找中间值,就让快指针每次移动2步,慢指针一次移动1步,直到快指针为空(链表长度为偶数)或快指针的next为空(链表长度为奇数)为止,此时慢指针的链表就是目标结果。

代码如下:

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode *slow = head, *fast = head;
        while (fast&&fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
};
原文地址:https://www.cnblogs.com/cff2121/p/11646141.html