给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路
对任意正整数 n,中间结点的编号可以表示成 ⌊2n⌋+1。
解法一
/*** Definition for singly-linked list.* public class ListNode {* public int val;* public ListNode next;* public ListNode(int val=0, ListNode next=null) {* this.val = val;* this.next = next;* }* }*/
public class Solution {public ListNode MiddleNode(ListNode head) {int n = 0;ListNode temp = head;while(temp != null){n++;temp = temp.next;}int middleCount = n / 2 + 1;temp = head;for(int i = 1; i < middleCount; i++){temp = temp.next;}return temp;}
}
复杂度分析
-
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次得到链表的结点数量,然后遍历链表定位到链表的中间结点。
-
空间复杂度:O(1)。
解二 快慢指针
public 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;}
}
复杂度分析
-
时间复杂度:O(n),其中 n 是链表的长度。快指针遍历链表一次,慢指针遍历链表的前半段一次。
-
空间复杂度:O(1)。