876.鏈表的中間結點(C語言)

題目要求:

解答版本一:

兩次遍歷,一次遍歷找出長度,一次遍歷找出中間結點。

/**
 * 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兩句話換一下位置,執行時間陡然增加。

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1016
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章