一、题目要求
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
二、初步解法
2.1 初步思想
使用ArrayList存储A中所有结点,随后直接获取ArrayList中的第size()/2个元素。
2.2 代码实现
class Solution {
public ListNode middleNode(ListNode head) {
List<ListNode> l = new ArrayList();
while(head != null) {
l.add(head);
head = head.next;
}
return l.get(l.size()/2);
}
}
2.3 运行结果
空间复杂度O(N),时间复杂度O(N)。
三、其他解法
3.1 算法思想
第一次遍历链表取得链表长度,随后第二次遍历到链表第length/2个位置返回该结点。
3.2 代码实现
class Solution {
public ListNode middleNode(ListNode head) {
int length = 0;
ListNode headPtr = head;
while(head != null) {
length++;
head = head.next;
}
for(int i = 0; i < length/2; i++) {
headPtr = headPtr.next;
}
return headPtr;
}
}
3.3 运行结果
空间复杂度O(1),时间复杂度O(N)。