leecode 刷题(32)-- 链表的中间节点

leecode 刷题(32)-- 链表的中间节点

描述:

给定一个带有头结点 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 之间。


思路:

做这道题有两种思路:

  1. 先遍历一遍整个链表,按顺序将每个节点放入数组 A 中,我们可以通过索引检索每个结点,那么中间节点就是 A[A.Length/2]
  2. 快慢指针法:设置两个指针:slow 和 fast,快指针速度是慢指针的两倍,遍历单链表,当 fast 指针到达链表的末尾时,slow 指针刚好在中间。

时间复杂度两种方法都需遍历一遍链表,都是 O(N) ,空间复杂度第一种方法为 O(N),第二种方法为 O(1), 明显快慢指针法更为高效。

代码如下:

这里仅给出快慢指针法的代码:

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

总结:

快慢指针法来解决单链表问题是一种很好的方法,之前我们也有写过一道跟该题类似的题目,也是采用快慢指针法来解决,即:

删除链表的倒数第N个节点

leecode原题:

链表的中间结点

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 10,051评论 1 45
  • 链表删除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷阅读 11,420评论 4 35
  • 单链表 单链表问题与思路 找出单链表的倒数第K个元素(仅允许遍历一遍链表)使用指针追赶的方法。定义两个指针fast...
    wxkkkkk阅读 3,696评论 0 0
  • 风和日丽的上午,和同事相约逛公园赏菊。 一早起床心情格外舒畅。看看窗外,天是那么蓝,云是那么白,风是那么柔。手机相...
    喵星小蔡阅读 1,612评论 0 1
  • 最近,边学习爱不完课程、群里姐妹们的分析,边反省自己,反省自己以前教育孩子的方式、方法是多么愚蠢,打着为孩子好的旗...
    初心不移阅读 1,631评论 2 4