#1、描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#2 思路 解法一
用一个计数器统计链表长度,然后再遍历一半的时候输出就好了,
#3、notes:
easy
#4、复杂度
时间:O(n) n是链表长度
空间:O( 1 )
#5、code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* ind;
int count=0;
ind=head;
while(ind!=NULL)
{
ind=ind->next;
count++;
}
ind=head;
int n=0;
while(n<count/2)
{
ind=ind->next;
n++;
}
return ind;
}
};
#2、解法二 思路:
快慢指针
#3、notes:
1 、 代码实现细节
#4、复杂度
时间: O (n)
空间 O (1)
# 5、code:
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* fast=head;
ListNode* last=head;
while(fast!=nullptr)
{
if(fast->next!=nullptr) // 当有下一个不为空时 ,快慢指针都要加一
{
fast=fast->next;
last=last->next;
if(fast->next!=nullptr) //如果快指针还有后一个,快指针要多加一个
fast=fast->next;
}
else //当快指针后边是空时候,快指针也要指向空,为了跳出循环
fast=fast->next;
}
return last;
}
};
########################################
一般习惯把少数的情况写在最前边,如下:
while(fast!=nullptr)
{
if(fast->next==nullptr)
return last;
else
{
fast=fast->next;
last=last->next;
if(fast->next!=nullptr)
fast=fast->next;
}
}
return last;