• (Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)


    给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
    如果有两个中间结点,则返回第二个中间结点。
     
    示例 1:
    输入:[1,2,3,4,5]
    输出:此列表中的结点 3 (序列化形式:[3,4,5])
    返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
    注意,我们返回了一个 ListNode 类型的对象 ans,这样:
    ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

    示例 2:
    输入:[1,2,3,4,5,6]
    输出:此列表中的结点 4 (序列化形式:[4,5,6])
    由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

     
    提示:

     给定链表的结点数介于 1 和 100 之间
    思路:
    学链表的时候听别人说,这好像是一道腾讯面试题,下面说思路。
    search是快指针,mid是慢指针,mid移动一个,search就移动两个,search指针移动到结尾,mid就指向了中间结点,返回即可,不过这题头结点竟然存放了数据,所以判断一下如果head->next == NULL,直接返回头结点
    还有两个思路就是先计数,用一个指针指向中间,或者导入数组寻找,不过效率都比快慢指针低
     1 struct ListNode* middleNode(struct ListNode* head)
     2 {
     3     struct ListNode *search;
     4     struct ListNode *mid;
     5     int mid_data;
     6 
     7     mid = search = head->next;
     8     if(mid == NULL)
     9     return head;
    10     while(search->next != NULL)
    11     {
    12         if(search->next->next != NULL)
    13         {
    14             search = search->next->next;
    15             mid = mid->next;
    16         }
    17         else
    18         {
    19             search = search->next;
    20         }
    21     }
    22 
    23     return mid;
    24 }
     
     
  • 相关阅读:
    vijos 1426
    2455 繁忙的都市
    2104 删除物品
    3235 战争
    BZOJ 2962
    COGS 265 线段覆盖
    P2184 贪婪大陆
    0729模拟赛解题报告
    BZOJ 1012
    BZOJ 2763
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12550197.html
Copyright © 2020-2023  润新知