Leetcode/Top Interview 150

[LinkedList][Medium] 82. Remove Duplicates from Sorted List II

자전거통학 2024. 5. 26. 23:31

https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/description

 

Q. 정렬된 리스트에서 중복된 값을 가진 노드를 제거하고 결과 노드를 출력하라.

 

Solution. 

 중복된 노드를 검색하고, 해당 노드 전후 처리 link 를 잘 해 주는 것이 핵심이라 하겠다. 

 다만, 중복노드 이전 노드를 알아야 중복이 끝난 지점 노드에 연결을 해 주므로, 이를 어떻게 처리하느냐 

 등이 조금 신경 쓸 여지가 있는 부분이 될 터이다. 

 

 최대한 현재 노드 기준으로 문제를 국한시키며, 단순화하는데 노력을 써 본다. 

 

더보기

 

public ListNode DeleteDuplicates(ListNode head) 
{
    const int INIT = int.MinValue;
    ListNode node = head;
    ListNode prev = null;
    int dup = INIT;
    ListNode newHead = null;
    while(node != null)
    {
        if(dup != INIT)
        {
            // 이미 삭제 중인 노드가 있으면, 현재 노드가 이 대상인지 확인 후 제거.
            if(node.val == dup)
            {
                if(prev != null)
                    prev.next = node.next;

                node = node.next;
                dup = node!=null && node.val==dup ? dup : INIT;
            }
            else 
                dup = INIT;
            
            continue;
        }

        // 현재 노드 기준, 노드가 다음 노드와 같으면 현재 노드 삭제.
        if(node.next!=null && node.val==node.next.val)
        {
            // remove cur 'node'.
            dup = node.val;
            if(prev != null)
                prev.next = node.next;
            node = node.next;
        }
        else 
        {
            // 삭제 대상이 아닌 노드 중 첫 노드가 새로운 head.
            if(newHead == null)
                newHead = node;

            dup = INIT;
            prev = node;
            node = node.next;
        }
    }
    return newHead;
}

 

 

요샌 그냥 이 정도면 만족스럽다... 으으..