014-链表中倒数第k个结点

用快慢指针:p2比p1先走k-1(1到k:间隔了k-1)步,然后再一起走,当p2为最后一个时,p1就为倒数第k个数

class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
def FindKthToTail(self, head, k):
if not head or k<=0: return None
p1 = head
p2 = head
#设置两个指针,p2指针先走(k-1)步,然后再一起走
while (k-1)>0:
if (p2.next != None):
p2 = p2.next
k -= 1
else:
return None
while (p2.next != None): # 等同while p2.next:
p1 = p1.next
p2 = p2.next
return p1

015-反转链表(链表转化赋值

思路:变化node.next

假设翻转1->2->3->4->5,(54321)

重要:

  • 1.构建辅助节点head
  • 2.我们将p的next指向tp的next
  • 3.将tp的next指向head的next
  • 4.将head的next指向tp
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
# 新链表的表头,不是head,是head.next
def ReverseList(self, pHead):
if not pHead:return None
#构建辅助节点head
head = ListNode(0)
head.next = pHead
p = pHead
while p.next != None:
#链表节点转化操作(重要)
tp = p.next
p.next = tp.next
tp.next = head.next
head.next = tp
return head.next

016-合并有序链表

思路:

新开个链表,两节点值比较,按大小存储即可

注意:head 与 pHead

class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def Merge(self, pHead1, pHead2):
if (not pHead1) and (not pHead2):return None
pHead = ListNode(0)
head = pHead
while pHead1 and pHead2:
if pHead1.val > pHead2.val:
pHead.next = pHead2
pHead2 = pHead2.next
else:
pHead.next = pHead1
pHead1 = pHead1.next
#注意:pHead也得移动到下一个
pHead = pHead.next
#注意:接收剩下得pHead1的所有值,不需要一个个去判断了(链表)
if pHead1:
pHead.next = pHead1
if pHead2:
pHead.next = pHead2
#注意:pHead已经移动了,所有是head.next
return head.next

017-树的子结构:

class Solution:
def HasSubtree(self, pRoot1, pRoot2):
#(ps:我们约定空树不是任意一个树的子结构)
if not pRoot1 or not pRoot2:return None
flag = False
#找到 A中与B根节点 相同的节点,判断接下来后续点
if pRoot1.val == pRoot2.val:
flag = self.DoseTreeAhasTreeB(pRoot1,pRoot2)
#如果没找到,继续遍历左,右子树,查找与B根节点 相同的节点
if not flag:
#if pRoot1.val != pRoot2.val:
flag = self.HasSubtree(pRoot1.left,pRoot2)
if not flag:
#if pRoot1.val != pRoot2.val:
flag = self.HasSubtree(pRoot1.right,pRoot2)
return flag # 需要注意的地方是: 前两个if语句不可以颠倒顺序
def DoseTreeAhasTreeB(self,pRoot1,pRoot2):
#如果B中节点遍历完了,A没完,说明B是A的子树
if not pRoot2:
return True
#如果B没遍历完,A遍历完了:说明B不是A的子树
if not pRoot1:
return False
#(都没遍历完)如果当前节点相同,继续遍历左右节点
if pRoot1.val == pRoot2.val:
return self.DoseTreeAhasTreeB(pRoot1.left,pRoot2.left) and self.DoseTreeAhasTreeB(pRoot1.right,pRoot2.right)
else:
return False

018-二叉树的镜像:

# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Mirror(self, root):
if not root:return None
#左右交换:
node = root.left
root.left = root.right
root.right =node
#对左右节点递归
self.Mirror(root.left)
self.Mirror(root.right)
#返回根节点
return root

019-顺时针打印矩阵:

class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
res = []
startX,startY,endX,endY = 0,0,len(matrix[0])-1,len(matrix)-1
while (startX <= endX and startY <= endY):
#1:
i1 = startX
while(i1 <= endX):
res.append(matrix[startY][i1])
i1 += 1
#2:
if endY > startY:
i2 = startY + 1
while(i2 <= endY):
res.append(matrix[i2][endX])
i2 += 1
#3:
if (endY > startY and endX > startX):
i3 = endX - 1
while(i3 >= startX):
res.append(matrix[endY][i3])
i3 -= 1
#4:
if (endY > startY+1 and endX > startX):
i4 = endY - 1
while(i4 >= startY + 1):
res.append(matrix[i4][startX])
i4 -= 1
startX += 1
startY += 1
endX -= 1
endY -= 1
return res

020-包含min函数的栈

class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = [] #辅助栈 def push(self, node):
min = self.min()
if not self.stack2 or node < min:
self.stack2.append(node)
else:
self.stack2.append(min)
self.stack1.append(node) def pop(self):
if self.stack2:
self.stack2.pop(-1)
return self.stack1.pop(-1) def top(self): #返回栈顶元素
if self.stack1:
return self.stack1[-1] def min(self):
if self.stack2:
return self.stack2[-1]

021-栈的压入、弹出序列

class Solution:
def IsPopOrder(self, pushV, popV):
stack=[] #辅助栈
while popV:
# pushV,stack存在的情况下
# 如果第一个元素相等,直接都弹出,根本不用压入stack
if pushV and popV[0]==pushV[0]:
popV.pop(0)
pushV.pop(0)
#如果stack的最后一个元素与popV中第一个元素相等,将两个元素都弹出
elif stack and stack[-1]==popV[0]:
stack.pop()
popV.pop(0)
# 如果pushV中有数据,压入stack
elif pushV:
stack.append(pushV.pop(0))
# 上面情况都不满足,直接返回false。
else:
return False
return True

022-从上往下打印二叉树

# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
if not root: return []
queue = []
res = [] #保存val
queue.append(root) #队列存储二叉树根节点
while queue:
node = queue.pop(0)
res.append(node.val)
#从左到右:队列存储二叉树左右节点
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res

023-二叉搜索树(BST)的后序遍历序列:

class Solution:
def VerifySquenceOfBST(self, sequence):
if not sequence:return False
#1.找到根节点:
root = sequence[-1]
#2.切分左右子树:找到右子树的第一个节点
for i in range(len(sequence)): #i的使用
if sequence[i] > root:
break
#3.判断是否为右子树:每个值都大于根
for j in range(i,len(sequence)):
if sequence[j] < root:
return False
#4.递归左,右子树
left = True
if i> 0:
left = self.VerifySquenceOfBST(sequence[0:i])
right = True
if i < len(sequence)-1:
#不包括最后一个值(根节点)
right = self.VerifySquenceOfBST(sequence[i:-1])
return left and right

024-二叉树中和为某一值的路径

# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def FindPath(self, root, expectNumber):
def subFindPath(root):
if root:
path.append(root.val)
#1.判断和是否相等,且该节点是否是叶节点
if not root.right and not root.left and sum(path) == expectNumber:
res.append(path[:])
#2.如果不是看它的左右节点
else:
subFindPath(root.left),subFindPath(root.right)
#!3.重点:回溯法
path.pop()
res, path = [], []
subFindPath(root)
return res

剑指Offer(Python)的更多相关文章

  1. 剑指offer——python【第54题】字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  2. 剑指offer——python【第38题】二叉树的深度

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 解题思路 想了很久..首先本渣渣就不太理解递归在python中的实现 ...

  3. 剑指offer——python【第28题】数组 中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  4. 剑指offer——python【第43题】左旋转字符串

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...

  5. 剑指offer——python【第44题】翻转单词顺序

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student ...

  6. 剑指offer——python【第21题】栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  7. 剑指offer——python【第16题】合并两个有序链表

    题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  8. 剑指offer——python【第2题】替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”. 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 理解 很容易想到用pytho ...

  9. 剑指offer——python【第59题】按之子形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路 这道题其实是分层打印二叉树的进阶版 ...

  10. 剑指offer——python【第60题】把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.#类似于二维列表[[1,2],[4,5]] 解题思路 其实这倒题和其他类似的题有所区别,这里是分层打印,把每层的节点值放在同一 ...

随机推荐

  1. Codechef QGRID

    QGRID code 给定一个 n × m(1 <= m <= 3) 的点网格,网格的边上以及点上都有权值.初始时所有点的权值都为 0 .维护两种操作:1. x1 y1 x2 y2 c 把 ...

  2. Python 函数的参数传递

    C/C++中,传递参数的类型是可以指定的.一般来说,传递参数可以分为两种:值传递和引用传递.对于值传递,参数传递的过程中进行了复制操作,也就是说,在函数中对参数的任何改动都不会影响到传入的变量:对于引 ...

  3. Lua变量

    Lua 变量 变量在使用前,必须在代码中进行声明,即创建该变量. 编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值. Lua 变量有三种类型:全局变量.局部变量.表中的域. ...

  4. XCode10 swift4.2 适配遇到的坑

    以下是2018年10月23日更新 经过大约一个月的时间的适配,项目正式使用XCode10(以下简称为10 or XC10)大部分库都升级为Swift4.2(以下简称为 4.2 or S4.2),下面是 ...

  5. Android Service完全解析,关于服务你所需知道的一切(下) (转载)

    转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog ...

  6. ashx 中获取 session获取信息

    1.在应用程序中获取session,System.Web.HttpContext.Current.Session: 2.命名空间如下:IRequiresSessionState 调用方法 public ...

  7. Suricata产生的数据存储目录

    不多说,直接上干货! 我这里呢,分两种常用的Suricata. 一.源码编译安装的Suricata 这里不多说,大家可以去看我下面写的博客 使用 Suricata 进行入侵监控(一个简单小例子访问百度 ...

  8. linux给文件或目录添加apache权限

    系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: ...

  9. dangerouslySetHTML 和 style 属性

    这一节我们来补充两个之前没有提到的属性,但是在 React.js 组件开发中也非常常用,但是它们也很简单. dangerouslySetHTML 出于安全考虑的原因(XSS 攻击),在 React.j ...

  10. android开发学习 ------- Error:Failed to open zip file.

    我们用Android Studio   Sync Project项目的时候,会出现如下的错误: 解决方案: Project视图下, 这块 https 改为 http 就可以了.