File tree Expand file tree Collapse file tree 1 file changed +91
-0
lines changed
remove-nth-node-from-end-of-list Expand file tree Collapse file tree 1 file changed +91
-0
lines changed Original file line number Diff line number Diff line change 1+ from typing import Optional
2+ from unittest import TestCase , main
3+
4+
5+ # Definition for singly-linked list.
6+ class ListNode :
7+ def __init__ (self , val = 0 , next = None ):
8+ self .val = val
9+ self .next = next
10+
11+ def values (self ) -> [int ]:
12+ result = []
13+ node = self
14+ while node :
15+ result .append (node .val )
16+ node = node .next
17+
18+ return result
19+
20+
21+ class Solution :
22+ def removeNthFromEnd (self , head : Optional [ListNode ], n : int ) -> Optional [ListNode ]:
23+ return self .solve_two_pointer (head , n )
24+ """
25+ Runtime: 0 ms (Beats 100.00%)
26+ Time Complexity: O(n)
27+ > list의 모든 node + dummy node를 탐색하므로 O(n + 1) ~= O(n)
28+
29+ Memory: 16.62 MB (Beats 15.78%)
30+ Space Complexity: O(1)
31+ > 포인터만 사용하므로 O(1)
32+ """
33+ def solve_two_pointer (self , head : Optional [ListNode ], n : int ) -> Optional [ListNode ]:
34+ if head .next is None :
35+ return None
36+
37+ dummy = ListNode (- 1 )
38+ dummy .next = head
39+ head = dummy
40+
41+ slow = fast = head
42+ while n :
43+ if fast .next :
44+ fast = fast .next
45+ n -= 1
46+
47+ while fast is not None :
48+ if fast .next is None :
49+ slow .next = slow .next .next
50+ break
51+ else :
52+ slow = slow .next
53+ fast = fast .next
54+
55+ return head .next
56+
57+
58+ class _LeetCodeTestCases (TestCase ):
59+ def test_1 (self ):
60+ node_1 = ListNode (1 )
61+ node_2 = ListNode (2 )
62+ node_3 = ListNode (3 )
63+ node_4 = ListNode (4 )
64+ node_5 = ListNode (5 )
65+
66+ node_1 .next = node_2
67+ node_2 .next = node_3
68+ node_3 .next = node_4
69+ node_4 .next = node_5
70+
71+ n = 2
72+ output = [1 , 2 , 3 , 5 ]
73+ self .assertEqual (Solution ().removeNthFromEnd (node_1 , n ).values (), output )
74+
75+ def test_2 (self ):
76+ node_1 = ListNode (1 )
77+ n = 1
78+ output = []
79+ self .assertEqual (Solution ().removeNthFromEnd (node_1 , n ).values (), output )
80+
81+ def test_3 (self ):
82+ node_1 = ListNode (1 )
83+ node_2 = ListNode (2 )
84+ node_1 .next = node_2
85+ n = 2
86+ output = [2 ]
87+ self .assertEqual (Solution ().removeNthFromEnd (node_1 , n ).values (), output )
88+
89+
90+ if __name__ == '__main__' :
91+ main ()
You can’t perform that action at this time.
0 commit comments