【刷题打卡】876. 链表的中间结点

81 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

一、题目描述:

876. 链表的中间结点

给定一个头结点为 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])
由于该列表有两个中间结点,值分别为 34,我们返回第二个结点。

提示:

  • 给定链表的结点数介于 1 和 100 之间。

二、思路分析:

这道题应该没有头结点吧,头结点应该没有val值,只是next指向链表第一个结点;

然后说思路

一般双指针解法的输出,在结点为偶数个时,取到的是前一个中间结点,输出时需要取next;

如何解决这个问题呢?

经过观察可知,当快指针(代码中的p指针)后移奇数位时,快慢指针同时后移;
当快指针后移偶数位时,快指针后移,而慢指针不动;
我是设置了一个标志位,标志奇偶;
这样,输出时直接输出慢指针所指结点即可。

三、AC 代码:

    /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head){
    int sign=0;
    struct ListNode *p=head,*q=head;
    while(p->next!=NULL){
        if(sign==0){
            p=p->next;
            q=q->next;
            sign=1;
            continue;
        }
        if(sign==1){
            p=p->next;
            sign=0;
        }
    }
    return q;
}

四、参考:

动画演示 快慢指针 876. 链表的中间结点 - 链表的中间结点 - 力扣(LeetCode)

【track & traning】快慢指针,思路简单,性能高效 - 链表的中间结点 - 力扣(LeetCode)