![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
lozixi
这个作者很懒,什么都没留下…
展开
-
剑指offer-15-反转链表
反转链表 题目:输入一个链表,反转链表后,输出新链表的表头。 思路:使用两个辅助节点(pre与next),pre最初为null,使用next记录head的下一个节点,head.next指向pre,pre和head后移一步。 边界:当head==null是结束循环,返回的为pre /* public class ListNode { int val; ListNode next ...原创 2019-07-18 19:52:07 · 83 阅读 · 0 评论 -
剑指offer-26-字符串的排列
字符串的排列 题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符’a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。(字符串的全排列:字符串的全部字符所能排列出来的所有字符串) 思路: 1.把字符串分为两部分:一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符。问题转换为先固定第一个字符,求剩余字符的排列...原创 2019-08-07 17:16:53 · 115 阅读 · 0 评论 -
剑指offer-25-二叉搜索树与双向链表
二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。(二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值) 思路:将整棵树分为根节点、左子树、右子树。在把左、右子树都转换成排序的双向链表之后再和根节点链接起来,整棵树就转换成了排序的双向链表。 1.使用一个全局变量指向已经转换...原创 2019-08-07 11:13:31 · 134 阅读 · 2 评论 -
剑指offer-24-复杂链表的复制
复杂链表的复制 题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。 思路: 法一.利用哈希表: 1.遍历原链表,创建原链表的拷贝节点(label值相同、next与random为空),将对应的关系存在map中。map的key为原节点,value为拷贝节点; 2.再次遍历,遍历到(1)节点时,通过哈希表...原创 2019-08-06 17:29:12 · 71 阅读 · 0 评论 -
剑指offer-22-二叉搜索树的后序遍历序列
剑指offer-22-二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路:在某二叉搜索树的后序遍历结果中,最后一个数字的数的根节点的值。数组中前面的数字可以分为两部分:第一部分时左子树节点的值,均比跟节点的值小;第二部分时右子树节点的值,均比根节点的值大。(**二叉搜索树...原创 2019-07-28 18:21:53 · 89 阅读 · 0 评论 -
剑指offer-21-从上往下打印二叉树
剑指offer-21-从上往下打印二叉树 题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路:二叉树的按层遍历(广度优先遍历),使用一个辅助队列。 1.每打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾。 接着从队列头部取出节点并打印,循环,直到队列中所有的节点都被打印出来。 2.队列常用方法:offer()、poll()、peek() Link...原创 2019-07-28 16:36:27 · 79 阅读 · 0 评论 -
剑指offer-20-栈的压入、弹出序列
剑指offer-20-栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 思路: 1.建立一个辅助栈,把输入的第一...原创 2019-07-28 15:42:29 · 110 阅读 · 0 评论 -
剑指offer-23-二叉树中和为某一值的路径
二叉树中和为某一值的路径 题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 思路: 1.当用前序遍历的方式访问到某一节点时,把该节点添加到路径上,并累加该节点的值; 2.如果该节点为叶节点,并且路径中节点值的和刚好等于目标值,则当前...原创 2019-08-05 21:30:53 · 68 阅读 · 0 评论 -
剑指offer-19-顺时针打印矩阵
剑指offer-19-顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下4X4矩阵:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。按此顺序存入列表中并返回。 思路:分圈实现。先打印外圈,然后左上角与右下角沿着对...原创 2019-07-22 20:39:47 · 124 阅读 · 0 评论 -
剑指offer-18-二叉树的镜像
二叉树的镜像 题目:操作给定的二叉树,将其变换为源二叉树的镜像。 思路:使用递归,前序遍历这颗树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左、右子节点后,就得到了树的镜像。 边界:递归为当前节点为null时结束,左子节点与右子节点为null时结束。 代码: /** public class TreeNode { int val ...原创 2019-07-22 18:51:10 · 84 阅读 · 0 评论 -
剑指offer-17-树的子结构
剑指offer-17-树的子结构 题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:约定空树不是任意一个树的子结构) 思路:共有两步判断: (1)在树A中找到和树B的根节点的值一样的节点R(树的遍历) (2)判断树A中以R为根节点的子树是不是包含和树B一样的结构 递归调用HasSubtree遍历二叉树A,如果发现某一节点的值和树B的头结点的值相同, 则调用doesTree1HasTre...原创 2019-07-22 11:14:58 · 71 阅读 · 0 评论 -
剑指offer-14-链表中倒数第k个结点
剑指offer-14-链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第k个结点。 思路:双指针,两个指针一开始都指向头结点,快指针走了k步之后,快慢指针开始同步移动。当快指针走到尾部时(超出链表),慢指针到达倒数第k个。 边界条件: 1.快指针走的时候考虑是否超出边界 2.两个指针一起走时考虑结束条件 /* public class ListNode { int val; ...原创 2019-07-17 21:17:36 · 134 阅读 · 0 评论 -
剑指offer-16-合并两个排序的链表
合并两个排序的链表 题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路: 1.非递归版本:使用两个辅助变量,list3和cur,list3为合链表的头节点,cur为目前添加到的最后一个节点。每次将list1.val和list2.val中小的节点连接到cur后面,并且对应的list变量后移一位。 2.递归版本:得到两个链表中值较小的头节点,作为...原创 2019-07-18 21:32:13 · 83 阅读 · 0 评论 -
剑指offer-27-数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路: 法一:若数组中有一个数字出现的次数超过了数组长度的一半,则对数组排序后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。 法二:使...原创 2019-08-07 19:54:28 · 100 阅读 · 0 评论