876.链表的中间结点(C语言)

题目要求:

876.链表的中间结点(C语言)_第1张图片

解答版本一:

两次遍历,一次遍历找出长度,一次遍历找出中间结点。

/**
 * 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(;inext;
    }
    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;inext;
    }
    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;
}

评价:876.链表的中间结点(C语言)_第2张图片

时间用时很完美。但是我发现了,fast和low两句话换一下位置,执行时间陡然增加。

你可能感兴趣的:(编程算法)