一:解题思路
方法一:先计算出链表的长度,然后用一个指针指向链表的首结点,让这个指针走链表一般的长度,最后就落在链表的中间位置。
方法二:快慢指针法,先让快指针和慢指针都分别指向链表首节点,快指针每次走两步,慢指针每次走一步,当快指针指向为空时,此时慢指针就指向中间节点。
二:完整代码示例 (C++版和Java版)
第一种方法C++:
class Solution { public: ListNode* middleNode(ListNode* head) { int len = 0; ListNode* p = head; for (ListNode* p = head; p != NULL; p = p->next, len++); for (int i = 0; i < len / 2; i++) { p = p->next; } return p; } };
第一种方法Java:
class Solution { public ListNode middleNode(ListNode head) { int len=0; ListNode node=head; for(ListNode p=head;p!=null;p=p.next,len++); for(int i=0;i<len/2;i++) { node=node.next; } return node; } }
第二种方法C++:
class Solution { public: ListNode* middleNode(ListNode* head) { ListNode* fast = head; ListNode* slow = head; while (fast != NULL && fast->next != NULL) { fast = fast->next->next; slow = slow->next; } return slow; } };
第二种方法Java:
class Solution { public ListNode middleNode(ListNode head) { ListNode fast=head; ListNode slow=head; while(fast!=null&&fast.next!=null) { fast=fast.next.next; slow=slow.next; } return slow; } }