Skip to content

Commit 0e09f18

Browse files
Add 'Middle of the Linked List'
1 parent 02c92b7 commit 0e09f18

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ A collection of LeetCode solutions
3232

3333
[Merge Two Sorted Lists](./src/merge_two_sorted_lists.py)
3434

35+
[Middle of the Linked List](./src/middle_of_the_linked_list.py)
36+
3537
[Product of Array Except Self](./src/product_of_array_except_self.py)
3638

3739
[Remove Nth Node From End of List](./src/remove_nth_node_from_end_of_list.py)

src/middle_of_the_linked_list.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""
2+
876. Middle of the Linked List
3+
4+
https://leetcode.com/problems/middle-of-the-linked-list
5+
6+
NOTES
7+
* Use two pointers. Advance the `fast` pointer by 2. Advance the `slow`
8+
pointer by 1. When `fast` reaches the end of the linked list, `slow` is at
9+
the middle node.
10+
11+
Example (where ○ represents null):
12+
13+
1 2 3 4 5
14+
● → ● → ● → ● → ● → ○ middle = 3
15+
16+
slow
17+
fast
18+
19+
1 2 3 4 5
20+
● → ● → ● → ● → ● → ○ middle = 3
21+
↑ ↑
22+
slow
23+
fast
24+
25+
1 2 3 4 5
26+
● → ● → ● → ● → ● → ○ middle = 3
27+
↑ ↑
28+
slow
29+
fast
30+
31+
When the list contains an even number of nodes, there are two middle nodes.
32+
To take the second middle node, use slow.next:
33+
34+
1 2 3 4 5 6
35+
● → ● → ● → ● → ● → ● → ○ middle = 4
36+
37+
slow
38+
fast
39+
40+
1 2 3 4 5 6
41+
● → ● → ● → ● → ● → ● → ○ middle = 4
42+
↑ ↑
43+
slow
44+
fast
45+
46+
1 2 3 4 5 6
47+
● → ● → ● → ● → ● → ● → ○ middle = 4
48+
↑ ↑
49+
slow
50+
fast
51+
"""
52+
53+
from src.classes import ListNode
54+
55+
56+
class Solution:
57+
def middleNode(self, head: ListNode | None) -> ListNode | None:
58+
if not head:
59+
return head
60+
61+
slow, fast = head, head
62+
63+
while fast.next and fast.next.next:
64+
slow = slow.next
65+
fast = fast.next.next
66+
67+
# Handle odd and even lists.
68+
return slow.next if fast.next else slow
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""
2+
876. Middle of the Linked List
3+
4+
https://leetcode.com/problems/middle-of-the-linked-list
5+
"""
6+
7+
from unittest import TestCase
8+
9+
from src.middle_of_the_linked_list import Solution
10+
11+
from .utils import create_linked_list_from_list, create_list_from_linked_list
12+
13+
14+
class TestSolution(TestCase):
15+
def test_1(self):
16+
exp = [3, 4, 5]
17+
l1 = create_linked_list_from_list([1, 2, 3, 4, 5])
18+
ll = Solution().middleNode(l1)
19+
assert create_list_from_linked_list(ll) == exp
20+
21+
def test_2(self):
22+
exp = [4, 5, 6]
23+
l1 = create_linked_list_from_list([1, 2, 3, 4, 5, 6])
24+
ll = Solution().middleNode(l1)
25+
assert create_list_from_linked_list(ll) == exp

0 commit comments

Comments
 (0)