在人世间有一种庸俗实例的大合唱,谁一旦对它屈服,就永远沉沦了。
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
方法一:数组
将链表内容存到数组里,通过数组下标访问
代码和复杂度分析不放了,很垃圾的做法
方法二:单指针法
第一次遍历获取长度,第二次遍历根据长度取节点
代码和复杂度分析不放了
方法三:快慢指针法
public ListNode middleNode(ListNode head) {
ListNode first = head;
ListNode second = head;
while (first != null && first.next != null){
first = first.next.next;
second = second.next;
}
return second;
}
复杂度分析
- 时间复杂度:O(N),其中 N 是给定链表的结点数目。
- 空间复杂度:O(1),只需要常数空间存放 slow 和 fast 两个指针。