题目要求:
解答版本一:
两次遍历,一次遍历找出长度,一次遍历找出中间结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *p=head;
p = p->next;
int flag = 0;
int mid = 0;
int i = 0;
while(p->next!=NULL){
flag++;
}
mid = flag/2+1;
p = head;
for(;i<mid;i++){
p = p->next;
}
return p;
}
评价:未通过执行,时间超时。
解答版本二:
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *p=head;
int length = 0;
while(p){
length++;
p = p->next;
}
p=head;
for(int i=0;i<length/2;i++){
p=p->next;
}
return p;
}
评价:参考了一下讨论,感觉这个和版本一差不多呀!但是为什么第一个版本无法通过呢?
解答版本三:
思路:快慢指针,省时省力
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *low=head;
struct ListNode *fast=head;
while(fast!=NULL&&fast->next!=NULL){
low=low->next;
fast=fast->next->next;
}
return low;
}
评价:
时间用时很完美。但是我发现了,fast和low两句话换一下位置,执行时间陡然增加。