題目要求:
解答版本一:
兩次遍歷,一次遍歷找出長度,一次遍歷找出中間結點。
/**
* 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兩句話換一下位置,執行時間陡然增加。