给定一个带有头结点 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 之间。
来源:力扣(LeetCode)

对于这样一个问题,我们很容易就可以想到解决方法,首先通过遍历链表得到表长n,然后再次从表头出发循环n/2次找到中间节点,这样的算法时间复杂度为O(3n/2)。
但是我们还有一个更好的方法,既双指针法来完成这道题目。
我们需要两个快慢指针,慢指针每次移动一位,快指针每次移动两位,而当快指针移动到尾部时,我们的慢指针刚好移动到中间节点,这样的算法时间复杂度为O(n/2)。

        fast = fast->next->next;slow = slow->next;

因为题目要求当存在两个中间节点,既长度为偶数时,需要返回第二个中间节点,所以我们可以这样设置循环条件

    while( fast && fast->next ){fast = fast->next->next;slow = slow->next;}

我们不用去判断fast->next->next是否存在,我们可以先让指针移动,然后在下一次循环中判断已经指向后两项的fast是否为空指针,这样就能保证当存在两个中间节点时我们返回的时第二个节点。
完整代码如下:

struct ListNode* middleNode(struct ListNode* head){struct ListNode* fast =head;struct ListNode* slow =head;while( fast && fast->next ){fast = fast->next->next;slow = slow->next;}return slow;
}

leetcode-876. 链表的中间结点解法相关推荐

  1. LeetCode 876——链表的中间结点

    1. 题目 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形 ...

  2. Leetcode 876. 链表的中间结点 (每日一题 20210918)

    给定一个头结点为 head 的非空单链表,返回链表的中间结点.如果有两个中间结点,则返回第二个中间结点.示例 1:输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) ...

  3. LeetCode 876. 链表的中间结点(快慢指针)

    1. 题目 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 2. 解题 快慢指针法 class Solution {public:List ...

  4. leetcode 876. 链表的中间结点 做题笔记

    题目: 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[ ...

  5. LeetCode 876. 链表的中间结点

    原题链接 解题思路:快慢指针,快指针走两步,慢指针走一步.快指针到NULL慢指针自然到中间位置 /*** Definition for singly-linked list.* struct List ...

  6. leetcode 876.链表中间结点

    链表中间结点 leetcode题目链接:876. 链表的中间结点 一.朴素解法 最直观的思路,因为不知道这个链表的长度,就先通过一次循环统计链表的长度len 之后第二次遍历,直到找到中间结点,输出 / ...

  7. LeetCode刷题 876链表的中间结点

    876. 链表的中间结点 难度简单550收藏分享切换为英文接收动态反馈 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[ ...

  8. 每日一道leetcode(python)876. 链表的中间结点

    每日一道leetcode(python)876. 链表的中间结点 2021-08-19 给定一个头结点为 head 的非空单链表,返回链表的中间结点.如果有两个中间结点,则返回第二个中间结点.示例 1 ...

  9. JavaScript——leetcode算法入门876. 链表的中间结点【双指针专题】

    题目描述 给定一个头结点为 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式: ...

  10. 【LeetCode题目详解】(二)206.反转链表、876.链表的中间结点

    目录 一.力扣第206题:反转链表 1.思路一 2.思路二 二.力扣第876题:链表的中间结点 1.思路一 2.思路二 总结 一.力扣第206题:反转链表 题目链接:206. 反转链表 - 力扣(Le ...

最新文章

  1. leetcode 424. Longest Repeating Character Replacement | 424. 替换后的最长重复字符(Java)
  2. maven打jar包pom配置
  3. go micro java_Java Micro Framework:您无法忽略的新趋势
  4. @Value(${xxxx})注解的配置及使用
  5. Tensorflow取消占用全部GPU
  6. 好用的python学习软件_5种好用的Python工具!Python学习分析
  7. Android中Service的使用
  8. 华为云PaaS梳理了客户可能上云的三类场景和七种解决方案
  9. springboot16 整合MyBatis
  10. 对文字颜色从左到右(横向)渐变的一点理解(坑)
  11. 深入浅出python系列(二):运算符
  12. AVR单片机学习笔记
  13. Matlab如何设置图中坐标以10的次方显示
  14. web python 取代js_web前端:JavaScript,只有你想不到
  15. linux计划任务5个*分表代表什么,Linux定时任务Crontab命令
  16. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。五 (上)京东后台提交订单,用户地址校验...
  17. keil写文字怎么会乱码_刚刚!2020福建高考作文题揭晓!你会怎么写?
  18. NYOJ 1248 海岛争霸 (利用最短路径可解)
  19. VSCode Competitive Programming Helper (cph)插件和Code Runner的C++17设置
  20. JAVA计算机毕业设计科院垃圾分类系统部署+源码+数据库+系统+lw文档

热门文章

  1. HID接口设备-简介
  2. 20155301实验三 免杀原理与实践
  3. linux常用命令和选项
  4. 深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现
  5. mysql5.7.14多实例安装
  6. doctype声明的意义
  7. 浅谈MD5加密算法中的加盐值(SALT)
  8. [转载] 启用和禁用 Reporting Services 的客户端打印和导出文件格式
  9. lua cocos 创建动画的几种方式
  10. CodeForces - 1359D Yet Another Yet Another Task(最大连续子段和)