✨题目

给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

✨样例

示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5])

示例2: 输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 (序列化形式:[4,5,6])

✨提示

  • 给定链表的结点数介于 1 和 100 之间。

👍解题

方法一:利用数组

链表和数组相比来说,不好求中间节点的原因在于我们没办法直接按照 长度 / 2 的方式,来得到中间的节点,所以我们不妨遍历整个链表,然后把所有节点都添加到 vector 中。然后直接返回 vector[ vector.size( ) / 2]就可以了

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* middleNode(ListNode* head) {
  14. vector<ListNode*> arr;
  15. while(head != NULL){
  16. arr.push_back(head); // 把所有的节点添加到vector中
  17. head = head->next;
  18. }
  19. int len = arr.size();
  20. return arr[len / 2];
  21. }
  22. };

方法二:单指针

上面说到,链表和数组相比来说,不好求中间节点的原因在于我们没办法直接按照 **长度 / 2** 的方式,来得到中间的节点,那我们不妨遍历一次链表,然后求出链表的长度,然后遍历的时候只遍历链表的一半长度即可。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* middleNode(ListNode* head) {
  14. ListNode* node = head;
  15. int sum = 0;
  16. int temp = 0;
  17. while(node != NULL){
  18. sum ++;
  19. node = node->next;
  20. }
  21. while(temp < sum / 2){
  22. head = head->next;
  23. temp ++;
  24. }
  25. return head;
  26. }
  27. };

方法三:快慢指针

不妨设置两个指针同时来遍历链表,其中一个快指针的步长为2慢指针的步长为1,这样的话,当快指针遍历到末尾的时候,慢指针一定是在链表的中间。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* middleNode(ListNode* head) {
  14. ListNode* high = head;
  15. ListNode* low = head;
  16. while(high != NULL && high->next != NULL){
  17. high = high->next->next;
  18. low = low->next;
  19. }
  20. return low;
  21. }
  22. };