diff --git a/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List.go b/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List.go new file mode 100644 index 00000000..ee885a40 --- /dev/null +++ b/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List.go @@ -0,0 +1,32 @@ +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 + } else { + return p1 + } +} diff --git a/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List_test.go b/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List_test.go new file mode 100644 index 00000000..ca68d1b7 --- /dev/null +++ b/Algorithms/876. Middle of the Linked List/876. Middle of the Linked List_test.go @@ -0,0 +1,56 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question876 struct { + para876 + ans876 +} + +// para 是参数 +// one 代表第一个参数 +type para876 struct { + one []int +} + +// ans 是答案 +// one 代表第一个答案 +type ans876 struct { + one int +} + +func Test_Problem876(t *testing.T) { + + qs := []question876{ + + question876{ + para876{[]int{1, 2, 3, 4, 5}}, + ans876{3}, + }, + question876{ + para876{[]int{1, 2, 3, 4}}, + ans876{3}, + }, + + question876{ + para876{[]int{1}}, + ans876{1}, + }, + + question876{ + para876{[]int{}}, + ans876{}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 876------------------------\n") + + for _, q := range qs { + _, p := q.ans876, q.para876 + fmt.Printf("【input】:%v 【output】:%v\n", p, L2s(middleNode(S2l(p.one)))) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/876. Middle of the Linked List/README.md b/Algorithms/876. Middle of the Linked List/README.md new file mode 100644 index 00000000..116375ce --- /dev/null +++ b/Algorithms/876. Middle of the Linked List/README.md @@ -0,0 +1,37 @@ +# [876. Middle of the Linked List](https://leetcode.com/problems/middle-of-the-linked-list/) + +## 题目 + +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: + +```c +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: + +```c +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. + +## 题目大意 + +输出链表中间结点。这题在前面题目中反复出现了很多次了。 + +如果链表长度是奇数,输出中间结点是中间结点。如果链表长度是双数,输出中间结点是中位数后面的那个结点。 + +这道题有一个很简单的做法,用 2 个指针只遍历一次就可以找到中间节点。一个指针每次移动 2 步,另外一个指针每次移动 1 步,当快的指针走到终点的时候,慢的指针就是中间节点。