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

本文探讨了寻找链表中点的三种不同算法,包括两次遍历法、预计算长度法及快慢指针法。通过对各方法的分析,揭示了快慢指针法的时间效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:

解答版本一:

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

/**
 * 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两句话换一下位置,执行时间陡然增加。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值