题目:
题解:
- 思路1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可
- 思路2:快慢指针,快指针走两步,慢指针走一步,等快指针走到链表尾节点时,慢指针的位置就是中位数的位置
代码如下:
class Solution {
public:
//题解1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可
ListNode* middleNode(ListNode* head) {
/*if(!head)return nullptr;
int n=0;
ListNode *p=head;
while(p){
++n;
p=p->next;
}
n=n/2+1;
while(--n){
head=head->next;
}
return head;*/
//将上面代码优化,直接将所有节点存放在一个vector中,然后我们返回数组中中位数的值
vector<ListNode*> middle;
while (head!=0) {
middle.push_back(head);
head = head->next;
}
return middle[middle.size()/2];
}
//题解2:快慢指针,快指针走两步,慢指针走一步,等快指针走到链表尾节点时,慢指针的位置就是中位数的位置
ListNode* middleNode_2(ListNode* head){
ListNode *slow=head,*fast=head;
//链表长度为奇数时,fast为尾节点,slow为中位数节点
//链表长度为偶数时,fast为尾后节点(nullptr),slow为后中位数节点
while(fast&&fast->next){
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
};