下面的方法比较好理解,感觉都需要事前知道或是推导出这个规律,然后才能写。
###方法1:
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
#把p,q分别指向headA, headB,统计A、B的链表长度
p, q = headA, headB
countA = countB = 0
while p != None:
p = p.next
countA += 1
while q != None:
q = q.next
countB += 1
#把m,n分别指向headA, headB
m, n = headA, headB
#如果A比B长,A先从头跳过长出来数
if countA > countB:
for i in range(countA - countB):
m = m.next
else:
for i in range(countB - countA):
n = n.next
#也就是把长A的前面长出来数跳过,然后从中间某个数开始跟B的head以此比较
while m != n:
m = m.next
n = n.next
return m
###方法2:
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
p, q = headA, headB
while p != q:
q = headB if q is None else q.next
p = headA if p is None else p.next
return p
2、判断链表是否有环,找到入环节点–python实现
用快慢指针的方法。时间复杂度O(n),空间复杂度O(1)。
设置p1为慢指针,p2为快指针,两者初始时都指向链表的头结点 ,慢指针p1每次前进1步,快指针p2每次前进2步。如果链表存在环,则快指针p2肯定先进入环,慢指针p1后进入环,两个指针必定会相遇。如果不存在环,则快指针会先行到达链表的尾部变为None。
3. 226反转二叉树
递归反转
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def invertTree(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
#递归
if not root:
return root
root.left,root.right=self.invertTree(root.right),self.invertTree(root.left)
return root
4、二叉树的前中后序、层次遍历
https://www.cnblogs.com/bjwu/p/9284534.html
最后应该return null?
LeetCode 322 零钱兑换 Python
思路如下:
此题可用动态规划求解,类似与背包问题,但每个硬币可用多次
初始化长度为amount+1的列表,除了第一个值为0外其余值均为-1
依次更新dp[i],dp[i]=min(dp[i-coins[j]])+1
《剑指offer》【两个链表的第一个公共结点】(python版)
计算两链表长度m,n;
快指针从较长的链表头先出发,走 | m - n | 步;
慢指针从较短链表头出发,与快指针以同样步长前进,直到两指针相等并且都不为空,即为公共结点
算法只对两链表分别进行两次遍历,时间复杂度为O(n)
2019年11月7日面试字节跳动EE组-北京:
45min笔试题(笔试来自牛客互联面面试真题):
(1)二叉树中序遍历;(2)输入字符串,实现四则运算
一面:
(1)任意四个点,二维数组,判断是不是正方形;
二面:
(1)有序数组的查找,二分;(3)无序数组的查找,要求时间复杂度最优;(2)图的思想,从A能否到D。
三面:
(1)最长不重复字串;(2)二分查找