[LeetCode] 876. Middle of the Linked List

蓝咒 提交于 2019-12-01 01:39:16

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;
    }
};

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!