![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
huangbo12138
菜鸡想变强
展开
-
链表中环的入口节点
题目描述 一个链表中包含环,请找出该链表的环的入口结点。要求不能使用额外的空间。 解析:快慢指针。快慢指针相遇时,快指针走了2k长度,慢指针走了k长度。多的k长度就是环的长度。假设相遇点距离环入口为m,则环入口距离起始点为k-m,恰巧相遇点的指针再走k-m节点就为环入口。所以同时继续出发,再次相遇点就是环的入口。 public ListNode EntryNodeOfLoop(ListNode ...原创 2019-11-12 22:59:39 · 83 阅读 · 0 评论 -
合并两个有序链表
递归 public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null) return list2; if (list2 == null) return list1; if (list1.val <= list2.val) { list1.next = Merge(list...原创 2019-11-12 16:26:12 · 75 阅读 · 0 评论 -
对称的二叉树
解析: boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) return true; return isSymmetrical(pRoot.left, pRoot.right); } boolean isSymmetrical(TreeNode t1, TreeNode t2) { if...原创 2019-11-12 16:02:55 · 77 阅读 · 0 评论 -
镜像二叉树
解析: public void Mirror(TreeNode root) { if (root == null) return; swap(root); Mirror(root.left); Mirror(root.right); } private void swap(TreeNode root) { TreeNode t = root.l...原创 2019-11-12 16:00:53 · 78 阅读 · 0 评论 -
两个栈实现队列,两个队列实现栈
题目描述 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 解析: Stack<Integer> in = new Stack<Integer>(); Stack<Integer> out = new Stack<Integer>(); public void push(int node) { in.pus...原创 2019-11-12 15:50:34 · 54 阅读 · 0 评论 -
在O(1)时间内删除节点
解析 1 如果不是尾节点,将要删除节点后继节点的值赋予当前节点,再将当前节点后继指向后继的后继,达到目的 2 如果是尾节点,则遍历至前一个节点,直接将前一个节点的后继指向null 时间复杂度分析:如果进行N次操作,N-1种可能性不会死尾节点,则操作次数为N-1,一种可能性为尾节点,操作次数为N。 所以总操作次数为2N-1.平均复杂度为2N-1/N = O(1) 代码: public ListNo...原创 2019-11-12 15:37:26 · 86 阅读 · 0 评论 -
层次打印二叉树
1从上往下打印二叉树 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7 解析: public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { Queue<TreeNode> queue = new LinkedList<...原创 2019-11-12 15:26:19 · 434 阅读 · 0 评论