1 minute read


sport

leet - Remove Nth Node From End of List

  • 아이디어
    • 두 포인터 간 거리를 n으로 유지하면서 오른쪽 포인터를 끝으로 옮기면,
    • 왼쪽 포인터가 가리키는 노드가 삭제할 노드가 된다.
    • 만약 오른쪽 포인터를 끝으로 옮기다가 거리가 n 되기 전에 끝에 도달했다면, 그건 head가 삭제할 노드라는 뜻이다.
  • 시간복잡도 O(n)

아이디어는 같은데, 엣지케이스 (끝/head)처리 귀찮아서 대충하다가 5번 틀림. (3RE, 2WA) 엣지케이스에 대해 곰곰히 생각 후 마지막 항목을 생각해냈고, 다시 짜보니 5분만에 풀림..

py solution
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        if not head.next:
            return None
        
        first = head
        second = head
        cnt = n
        
        while cnt > 0:
            if not second.next:
                return head.next
            second = second.next
            cnt -= 1
        
        while second.next:
            first = first.next
            second = second.next
        
        first.next = first.next.next
        return head
  • 다른 사람 풀이
    • 대부분 원리는 같음
    • head 앞에 더미 노드를 추가해서 구현을 간단하게 함.
    • (slow가 head더라도, head_dummy.next가 head를 )
    • 시간복잡도 O(n)
py solution

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        head_dummy = ListNode()
        head_dummy.next = head

        slow, fast = head_dummy, head_dummy
        for _ in range(n): 
            fast = fast.next

        while(fast.next!=None):
            slow = slow.next
            fast = fast.next

        slow.next = slow.next.next
        return head_dummy.next

Tags:

Categories:

Updated:

Comments