LC吐血整理之Linkedlist篇
206.反转链表
看到一个很有意思的答案
class Solution:
def reverseList(self, head):
p, rev = head, None
while p:
rev, rev.next, p = p, rev, p.next
return rev
Tips1: Python的连续赋值
python中可以使用连续赋值的方式来一次为多个变量进行赋值的
>>> x=y=z=1 等价于 x, y, z = 1, 1, 1
# 需注意 如果赋值为列表或者字典
>>> x=y=z=[1,2,3]
>>> a[1] = 4 # x,y,z 都是指向列表的指针
b = [1,4,3]
Tips2: Python的多元赋值
python的多元赋值原理: tuple的元组封装和序列拆封
>>> t = ‘hello’, ‘amilyxy’, ‘bye’ # 元组封装 (‘hello’, ‘amilyxy’, ‘bye’)
>>> x, y, z = t # 序列拆封 要求左侧变量数目与序列元素数目相等
x:'hello' y:'amilyxy' z:'bye'
# 多元赋值变量交换:先将等号右边进行元组封装
>>> x,y,z = z,x,y # x,y,z = (x:'bye','hello','amilyxy')
x:'bye' y:'hello' z:'amilyxy'
141.环形链表
其实这个题目我是这样想的,给链表实例对象添加一个属性,记录是否被访问到了 ,但其实本质也是把链表破坏了,有点不太好==
感觉双指针是比较好的解决方法,指针slow
每次走一步,指针fast
每次走两步,如果他们最终遇上了,就说明链表中有环
24.两两交换链表中的节点
看看就好,变量太多,不推荐
我的迭代解决方案
328.奇偶链表
刚开始根据数学归纳法找规律,写了很久,奇链表好不容易提取出来了,偶链表就乱了,难,真的难... 然后一直绕在原地操作,题解方法想都没想到,以为是链表就摆在那里了,一点都不能动....
代码在github,多多思考消化~~
92.反转链表II
一开始做的很乱,转了一次之后,后面的就乱套了,然后看了下反转链表I,结合反转链表I做出来了,哎,之前做的都忘掉了....
大致思路:
21.合并两个有序链表
剑指offer上也出现了这个题,可以掌握两种做法:① 递归方法(代码简洁,当链表过长时不适用)② 迭代方法,都可以写一下熟悉。
今日份的Tips:
递归题解中强调了python的return
语句中or
和 and
的区别:and 和 or 都有提前截至运算的功能
-
return a and b
:表达式a为 False,那么表达式b将被跳过,返回表达式a,例如:return [] and 'amilyxy' = return []
;表达式a为True,返回表达式b的值。 -
return a or b
:如果表达式a已经为 True,那么表达式b将被跳过,直接返回表达式a的结果,例如return 1 or 2 = return 1
;如果表达式a为False,返回表达式b的值。
注意,这里的return不再return True or False 而是返回表达式的值。
23.合并k个有序链表
21题的扩展版,按照21题的迭代方法稍微修改一下,运行到130个实例超出时间限制...后来加了一个判断条件还是超时==
今日份的Tips-1:heapq
贴几个知识链接:
1.数据结构-堆,我以前都是把堆栈视为同一个概念,naive啊。
2.Python文档-堆队列算法堆常用来实现优先队列算法,优先队列让你能够以任意顺序添加对象,并随时找出(删除)最小的元素,比min()
高效,python中没有堆这个数据结构,但heapq模块提供了堆队列算法的实现,也称为优先队列算法。
138.复制带有随机指针的链表
想清楚操作还是不难的,就是一个指针的指向问题。