Solution 1Two Stack

# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

class MinStack:

    def __init__(self):
        self.minStack = []
        self.stack = []

    def push(self, val: int) -> None:
        self.stack.append(val)
        if self.minStack:
            self.minStack.append(min(self.minStack[-1], val))
        else:
            self.minStack.append(val)

    def pop(self) -> None:
        self.stack.pop(-1)
        self.minStack.pop(-1)

    def top(self) -> int:
        return self.stack[-1]

    def getMin(self) -> int:
        return self.minStack[-1]
Leet Code/python.py · L693–722
// Typical Solution
// // This solution can be considered as optimized for interview purposes, but for competitive coding level use ListNode solution. 
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
class MinStack2 {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;

    public MinStack2() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if (minStack.isEmpty()) {
            minStack.push(val);
        } else {
            minStack.push(Math.min(val, minStack.peek()));
        }
    }

    public void pop() {
        stack.pop();
        minStack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}
Leet Code/java.java · L660–701

Solution 2Linked List Rescan

Java
// // Competitive level optimized solution, kind of overkill for real world scenarios
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
class MinStack {
    ListNode list;
    int min = Integer.MAX_VALUE;
    public MinStack() {
        list = null;
    }

    public void push(int val) {
        min = Math.min(val, min);
        ListNode node = new ListNode(val, list);
        list = node;
    }

    public void pop() {
        int val = list.val;
        list = list.next;
        if(val == min) {
            min = Integer.MAX_VALUE;
            ListNode dummy = list;
            while(dummy != null) {
                min = Math.min(min, dummy.val);
                dummy = dummy.next;
            }
        }
    }

    public int top() {
        return list.val;
    }

    public int getMin() {
        return min;
    }
}
Leet Code/java.java · L615–658