Code snippets for my permanent memory

Published on: April 27, 2025

#Coding#Leetcode

Trie implementation

class TrieNode {
public:
    bool isEnd;
    TrieNode* children[26];
 
    TrieNode() {
        isEnd = false;
        for (int i = 0; i < 26; i++) {
            children[i] = nullptr;
        }
    }
};
 
class Trie {
private:
    TrieNode* root;
 
public:
    Trie() {
        root = new TrieNode();
    }
 
    // Insert a word into the trie.
    void insert(string word) {
        TrieNode* node = root;
        for (char c : word) {
            int idx = c - 'a';
            if (node->children[idx] == nullptr) {
                node->children[idx] = new TrieNode();
            }
            node = node->children[idx];
        }
        node->isEnd = true;
    }
 
    // Search a word in the trie.
    bool search(string word) {
        TrieNode* node = root;
        for (char c : word) {
            int idx = c - 'a';
            if (node->children[idx] == nullptr) {
                return false;
            }
            node = node->children[idx];
        }
        return node->isEnd;
    }
 
    // Check if there exists any word that starts with the given prefix.
    bool startsWith(string prefix) {
        TrieNode* node = root;
        for (char c : prefix) {
            int idx = c - 'a';
            if (node->children[idx] == nullptr) {
                return false;
            }
            node = node->children[idx];
        }
        return true;
    }
};

Reverse a linked list

ListNode* reverseList(ListNode* head) {
    ListNode* previous = nullptr;
    ListNode* current = head;
 
    while (current != nullptr) {
        ListNode* nextNode = current->next;
        current->next = previous;
        previous = current;
        current = nextNode;
    }
 
    return previous;
}

Find middle of a linked list

ListNode* findMiddle(ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
 
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;
    }
 
    return slow;
}

Detect cycle in a linked list (Floyd's Tortoise and Hare)

ListNode* detectCycle(ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
 
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            // Cycle detected
            return slow;
        }
    }
 
    return nullptr; // No cycle
}

Merge two sorted linked lists

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode dummy;
    ListNode* tail = &dummy;
 
    while (l1 != nullptr && l2 != nullptr) {
        if (l1->val < l2->val) {
            tail->next = l1;
            l1 = l1->next;
        } else {
            tail->next = l2;
            l2 = l2->next;
        }
        tail = tail->next;
    }
 
    if (l1 != nullptr) tail->next = l1;
    if (l2 != nullptr) tail->next = l2;
 
    return dummy.next;
}

Binary Search

int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
 
    while (left <= right) {
        int mid = left + (right - left) / 2;
 
        if (nums[mid] == target) return mid;
        else if (nums[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
 
    return -1; // Not found
}

Backtracking

class Solution {
private:
    void backtrack(/* input parameters */,
                   /* current state */,
                   /* result container */) {
        if (/* base case: final condition reached */) {
            // Save current valid result
            return;
        }
 
        for (/* all choices at this step */) {
            // Make a choice
            // Move forward (recursive call)
            // Undo the choice (backtrack)
        }
    }
 
public:
    vector<string> solveProblem(/* input */) {
        vector<string> results;
        string currentState; // or vector<int>, etc.
        backtrack(/* inputs */, /* initial state */, results);
        return results;
    }
};