Back to Leetcode Go

876. Middle of the Linked List

website/content.en/ChapterFour/0800~0899/0876.Middle-of-the-Linked-List.md

1.7.971.9 KB
Original Source

876. Middle of the Linked List

Problem

Given a non-empty, singly linked list with head node head, return a middle node of linked list.

If there are two middle nodes, return the second middle node.

Example 1:


Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
The returned node has value 3.  (The judge's serialization of this node is [3,4,5]).
Note that we returned a ListNode object ans, such that:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL.

Example 2:


Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
Since the list has two middle nodes with values 3 and 4, we return the second one.

Note:

  • The number of nodes in the given list will be between 1 and 100.

Summary

Output the middle node of the linked list. This problem has appeared many times in previous problems.

If the length of the linked list is odd, the middle node to output is the middle node. If the length of the linked list is even, the middle node to output is the node after the median.

Solution Approach

There is a very simple approach to this problem: use 2 pointers and traverse only once to find the middle node. One pointer moves 2 steps each time, and the other pointer moves 1 step each time. When the fast pointer reaches the end, the slow pointer is the middle node.

Code

go

package leetcode

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func middleNode(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	p1 := head
	p2 := head
	for p2.Next != nil && p2.Next.Next != nil {
		p1 = p1.Next
		p2 = p2.Next.Next
	}
	length := 0
	cur := head
	for cur != nil {
		length++
		cur = cur.Next
	}
	if length%2 == 0 {
		return p1.Next
	}
	return p1
}