给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5])
方法一:快慢指针(当快指针走到末端时,慢指针恰好走到中部)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
if(head == NULL) return head;
ListNode* fast = head , *slow = head;
while(fast != NULL && fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
};
方法二:数组(将节点赋值给数组,取数组中部)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
if(head == NULL) return head;
vector<ListNode*> vals;
while(head!=NULL){
vals.push_back(head);
head = head->next;
}
return vals[vals.size()/2];
}
};