leetcode-876. 链表的中间结点

22 阅读1分钟

题目要求:

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1: image.png 输入: head = [1,2,3,4,5]
输出: [3,4,5]
解释: 链表只有一个中间结点,值为 3 。

示例 2: image.png 输入: head = [1,2,3,4,5,6]
输出: [4,5,6]
解释: 该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示
链表的结点数范围是 [1, 100]
1 <= Node.val <= 100

链接leetcode.cn/problems/mi…

解题思路

使用快慢指针,快指针是慢指针的二倍,当快指针遍历结束时,慢指针对应的节点就是中间节点

代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode) *ListNode {
	// use two points
	slow, fast := head, head
	for fast != nil && fast.Next != nil {
		slow = slow.Next
		fast = fast.Next.Next
	}
	return slow
}
//如果习惯使用dummy的话,会构建一个前置节点,需要使用slow.next输出最终结果,代码如下:
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode) *ListNode {
	// use two points
	dummy := &ListNode{Next: head}
	slow, fast := dummy, dummy
	for fast.Next != nil && fast.Next.Next != nil {
		slow = slow.Next
		fast = fast.Next.Next
	}
	return slow.Next
}

还可以使用求链表长度,然后求出中间节点,这个思路比较简单,但是代码效率低

代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode) *ListNode {
	n := 0
	dummy := head
	for head != nil {
		n++
		head = head.Next
	}
	for i := 0; i < (n/2); i++ {
		dummy = dummy.Next
	}
	return dummy
}