[알고리즘] 7 - O(N) 시간 복잡도 및 O(1) 공간 복잡도가 있는 Palindrome Linked List에 대한 나의 솔루션

5446 단어
Link for the problem

문제에 대한 나의 이해


  • 아이디어: 느린 포인터가 앞으로 이동함에 따라 노드를 뒤집습니다. 빠른 포인터가 목록의 끝에 도달하면 느린 포인터가 있는 노드와 반전된 노드를 비교합니다.
  • 에지 케이스:
  • 목록에 노드 수가 홀수이면 어떻게 됩니까? 예) [1,2,3,4,5]
  • 노드 수가 홀수인지 짝수인지 파악하는 데 사용한 방법은 다음과 같습니다.
  • 빠른 포인터의 다음이 존재하는 경우 => 짝수
  • 빠른 포인터의 다음이 존재하지 않는 경우 => 홀수

  • 목록에 노드가 하나만 있는 경우 => true(2는 중요하지 않음)


  • 
    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            ListNode* dummy = new ListNode();
            ListNode* slowPrev = dummy, *slow = head, *slowNext = slow, *fast = head;
            dummy->next = head;
            bool isOdd = false;
    
            while(fast){
    
                // Move fast forward
                if(fast->next){
                    fast = fast->next->next;
                }else{
                    fast = fast->next;
                    isOdd = true;
                }
    
                // Reverse slow
                slowNext = slow->next;
                slow->next = slowPrev;
                slowPrev = slow;
                slow = slowNext;
            }
    
            // Detach dummy node (otherwise will get memory access error)
            head->next = nullptr;
            delete dummy;
    
            if(isOdd){
                slowPrev = slowPrev->next;
            }
    
            while(slowPrev && slow){
                if (slow->val != slowPrev->val) return false;
                slowPrev = slowPrev->next;
                slow = slow->next;
            }
    
            return true;
        }
    };
    

    좋은 웹페이지 즐겨찾기