设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) -- 将元素 x 推入栈中。

  • pop() -- 删除栈顶的元素。

  • top() -- 获取栈顶元素。

  • getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

上期的问题是:141, 环形链表

 1public boolean hasCycle(ListNode head) {
2    if (head == null) return false;
3    ListNode walker = head;
4    ListNode runner = head;
5    while (runner.next != null && runner.next.next != null) {
6        walker = walker.next;
7        runner = runner.next.next;
8        if (walker == runner) return true;
9    }
10    return false;
11}

解析:

这个基本上就比较简单了,就是使用两个指针一个快一个慢,当他们相遇的时候就说明有环,否则就是无环,这个直接想可能不太容易,画个图就很容易看明白了,这里的有环有两种情况,一种是0型的有环,一种是6型的有环,0型的有环很简单,我们这里说的是6型的。这里我们还可以找到环的起点,当快慢指针相遇的时候,这时候在用一个指针从head开始并且和之前相遇的慢指针同时开始,每次走一步,当他们相遇的时候就是环的起点,有兴趣的可以自己尝试着写一下,这里就不在过多叙述。我们再来看另一种写法

1public boolean hasCycle(ListNode head) {
2    if (head == null || head.next == nullreturn false;
3    if (head.next == head) return true;
4    ListNode nextNode = head.next;
5    head.next = head;
6    return hasCycle(nextNode);
7}

这个其实也很容易理解,就是把当前的节点一个个删除,如果没环直接就删完了,如果有环,那么环的起点会有两个指针指向他,删到最后肯定是自己指向自己。这种方式会破坏链表的结构,但题目中也没说不准破坏链表结构,所以这种方式也是可以的。