notes/OJ notes/pages/Leetcode Middle-of-the-Linked-List.md

103 lines
2.3 KiB
Markdown
Raw Normal View History

2022-07-13 09:15:30 +08:00
# Leetcode Middle-of-the-Linked-List
#### 2022-07-13 09:08
> ##### Algorithms:
> #algorithm #two_pointers
> ##### Data structures:
> #DS #linked_list
> ##### Difficulty:
> #coding_problem #difficulty-easy
> ##### Additional tags:
> #leetcode
> ##### Revisions:
> N/A
##### Related topics:
```expander
tag:#two_pointers
```
2022-07-14 09:33:23 +08:00
- [[Leetcode Intersection-of-Two-Arrays-II]]
- [[Leetcode Merge-Sorted-Array]]
- [[Leetcode Merge-Two-Sorted-Lists]]
- [[Leetcode Move-Zeroes]]
- [[Leetcode Remove-Nth-Node-From-End-of-List]]
- [[Leetcode Reverse-Words-In-a-String]]
- [[Leetcode Squares-of-a-Sorted-Array]]
- [[Leetcode Two-Sum-II-Input-Array-Is-Sorted]]
- [[Two pointers approach]]
2022-07-13 09:15:30 +08:00
##### Links:
- [Link to problem](https://leetcode.com/problems/middle-of-the-linked-list/)
___
### Problem
Given the head of a singly linked list, return the middle node of the linked list.
If there are two middle nodes, return the second middle node.
#### Examples
**Example 1:**
![](https://assets.leetcode.com/uploads/2021/07/23/lc-midlist1.jpg)
**Input:** head = [1,2,3,4,5]
**Output:** [3,4,5]
**Explanation:** The middle node of the list is node 3.
**Example 2:**
![](https://assets.leetcode.com/uploads/2021/07/23/lc-midlist2.jpg)
**Input:** head = [1,2,3,4,5,6]
**Output:** [4,5,6]
**Explanation:** Since the list has two middle nodes with values 3 and 4, we return the second one.
#### Constraints
- The number of nodes in the list is in the range `[1, 100]`.
- `1 <= Node.val <= 100`
### Thoughts
> [!summary]
> This is a #two_pointers problem
> To find the middle of linked list, use two pointers:
> one fast pointer and one small pointer
### Solution
```cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode *middleNode(ListNode *head) {
// two pointers problem.
ListNode *fast, *slow;
fast = slow = head;
while (true) {
if (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
} else if (!fast->next) {
return slow;
} else if (!fast->next->next) {
return slow->next;
}
}
}
};
```