快慢指针法:用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。当 fast 到达链表的末尾时,slow 必然位于中间。
struct ListNode {
int val;
ListNode *next;
ListNode():val(0),next(nullptr){}
ListNode(int x):val(x),next(nullptr){}
ListNode(int x,ListNode *next):val(x),next(next) {}
};
class Solution {
public:
ListNode *middleNode(ListNode *head) {
if(head->next==nullptr)return head;
ListNode *fir = head;
ListNode *sec = head;
while(fir!=nullptr&&fir->next!=nullptr) {
fir = fir->next;
fir = fir->next;
sec= sec->next;
}
return sec;
}
};