目录:

基本使用 //

21题 合并有序链表 //

83题 删除有序链表重复元素 //

141题 环形链表 //

160题 相交链表 //

203题 移除链表元素//

206题 反转链表 //

基本使用:

之前没有学过链表,leetcode最近在做简单题,才发现链表的定义,元素之间是通过节点连接的。链表类定义以后的函数调用解释:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = nextp = ListNode()
l1: ListNode
#l1 就是链表里的指针所在的位置以及之后的元素#若此链表为[1, 2, 3]
#l1 = [1, 2, 3]
#l1.next = [2, 3]
l1.val #默认第0个元素 例子中为1l1 = l1.next #指针后移
#此时l1.val 为2
#l1.next = [3]p.next = ListNode(l1.val) #这个元素值赋给链表p的下一个元素

21题 合并有序链表

将两个有序链表合并为一个新的升序链表

class Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:p = ListNode()ans = pwhile l1 and l2:if l1.val < l2.val:p.next = ListNode(l1.val)l1 = l1.nextelse:p.next = ListNode(l2.val)l2 = l2.nextp = p.nextif l1:p.next = l1else:p.next = l2return ans.next
# p.next不被直接返回是因为p此时指针已经到了最后一个元素
#而提前设置的ans和p指向同一个链表,那么使用ans.next返回整个链表

83题 删除排序链表中的重复元素

1. 设置prev, cur = head, head.next, prev与head指向同一个链表 ;

2. perv.val == cur.val 时 prev跳过下一个值(cur.val) 直接保存next为cur.next 即 prev.next = cur.next ;  (指到后继节点的后继节点来删除本身的后继节点)

3. 若非如此,prev后移一个即 prev = cur. ;

4. 无论如何,cur = cur.next 后移往前进着

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def deleteDuplicates(self, head: ListNode) -> ListNode:if not head:return headperv, cur = head, head.nextwhile cur:if perv.val == cur.val:perv.next = cur.nextelse:perv = curcur = cur.nextreturn head

141题 环形链表

看了某站up的讲解,才知道环形链表的意思...

环形通常出现在有循环处,那么一般就可用这两种常见办法。同类题型可见202题 快乐数。

方法一: 又顺便学了哈希表,哈希表在python里就是dict和set. dict相当于保存2个list,一个元素本身 一个下标(映射)。set保存1个list,元素本身。这个题可以使用哈希表存储,环形链表的环会存在于已建立的哈希表内,因此True条件为:node in s

class Solution:def hasCycle(self, head: ListNode) -> bool:if not head: return Falses = set()node = headwhile node:if node in s:return Trueelse:s.add(node)node = node.nextreturn False

方法二:快慢指针。还是很好理解的

class Solution:def hasCycle(self, head: ListNode) -> bool:if not head: return Falsefast = slow = headwhile fast and fast.next:slow = slow.nextfast = fast.next.next #总是快一步,那么进入循环后总会在第二圈赶上slow,即相等if slow == fast:return Truereturn False

160题 相交链表

方法一:用哈希表存储headA的所有后续节点,遍历headB,若遍历到指针存在于此哈希表,则说明存在。(这个是自己想出来的~)

class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:s = set()nodeA = headAnodeB = headBwhile nodeA:s.add(nodeA)nodeA = nodeA.nextwhile nodeB:if nodeB in s:return nodeBnodeB = nodeB.nextreturn None

方法二:双指针。(来源用户 Krahets 题解)假设headA有a个节点,headB有b个节点,相交于c节点,设置2个指针:指针A从headA开始遍历,结束后遍历B至节点处需要走 (a+b-c) 个节点;指针B从headB开始遍历,结束后遍历A至节点处需要走 (b+a-c) 个节点,指针会相遇。返回此时指针A,若不相遇则A会遍历完 a+b 所有节点指向null. 时间复杂度O(a+b), 空间复杂度O(1) 常数大小的额外空间。

class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B = headA, headBwhile A != B:A = A.next if A else headB #若headA遍历完成则A=headB开始遍历B = B.next if B else headAreturn A

看到评论有人问为什么 A = A.next if A else A = headB 会报错,因为A = 赋值+赋值条件,后面是一个模块,等于语句 if A: A = A.next else: A = headB.  ifelse语句在赋值使用当然不需要再加赋值号啦...

203题 移除链表元素

思路很简单,保证第一个节点满足要求,然后进入判断循环,如果后继节点等于val就跳过后继节点赋值给next,否则直接指针后移。注意一点在保证头节点满足要求之后

leetcode 中的链表简单题 python3相关推荐

  1. LeetCode Python实现 链表简单部分

    LeetCode Python实现 链表简单部分 我以前完全没有写过关于链表的东西,node.val=node.next.val#当前值被后一个值覆盖node.next=node.next.next# ...

  2. LeetCode 141. 环形链表 简单难度

    ** 141. 环形链表 ** 给定一个链表,判断链表中是否有环. 如果链表中存在环,则返回 true . 否则,返回 false . 解题思路(两种方法): 方法一:用集合set以及set.find ...

  3. [LeetCode] LeetCode中与有向图相关的题目总结

    文章目录 相关题 743. 网络延迟时间 684. 冗余连接 相关题 LeetCode中有向图相关的题的题号为:743,685,684,399,332,310,210 743. 网络延迟时间 有 N ...

  4. LeetCode简单题之二进制矩阵中的特殊位置

    题目 给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 . 特殊位置 定义:如果 mat[i][j] == 1 ...

  5. 【剑指offer】leetcode刷题 -- Python3实现 -- 共75题(更新中)

    目录: 1. 剑指 Offer 03. 数组中重复的数字 -- 简单2. 剑指 Offer 04. 二维数组中的查找 -- 简单3. 剑指 Offer 05. 替换空格 -- 简单4. 剑指 Offe ...

  6. LeetCode简单题之字符串中的单词数

    题目 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符. 请注意,你可以假定字符串里不包括任何不可打印的字符. 示例: 输入: "Hello, my name is John&q ...

  7. LeetCode简单题之在长度 2N 的数组中找出重复 N 次的元素

    题目 给你一个整数数组 nums ,该数组具有以下属性: nums.length == 2 * n. nums 包含 n + 1 个 不同的 元素 nums 中恰有一个元素重复 n 次 找出并返回重复 ...

  8. LeetCode简单题之比赛中的配对次数

    题目 给你一个整数 n ,表示比赛中的队伍数.比赛遵循一种独特的赛制: 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对.总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮. ...

  9. 为了OFFER,花了几个小时,刷下Leetcode链表算法题

    @Author:Runsen @Date:2020/9/13 链表是我这辈子的痛啊,每次学到链表,就往往不会,就没有继续学下去.现在大四不能继续让这个链表阻碍我了.现在基本是重刷数据结构和算法,毕竟笔 ...

最新文章

  1. windows 10 下部署WCF 一些细节
  2. eclipse 代码中突然出现特殊字符
  3. 【220】◀▶ IDL 数组操作函数说明
  4. Springboot2集成minidao持久层
  5. 前端有未来吗?听我娓娓道来!
  6. 可蠕虫 DarkRadiation 勒索软件瞄准 Linux 和 Docker 实例
  7. 26.TCP/IP 详解卷1 --- Telnet 和 Rlogin : 远程登录
  8. Android利用手机拍照和从相册读取照片的方法
  9. Java多线程实现-线程池
  10. 软件质量应该如何保证?针对不同情况,项目各部门人员应如何保证软件质量?
  11. Kotlin入门(27)文件读写操作
  12. 微软ime日文输入法怎么设置切换过来就是输入假名的状态
  13. 阅读分享——李开复老师《开工愉快:如何保持每天精力充沛》
  14. 民进自强进修学院 计算机,#民进自强#中复班学生周记摘录
  15. [论文阅读笔记17]MAT: Motion-Aware Multi-Object Tracking
  16. Educoder - Java类和对象之对象组合之求圆锥体表面积
  17. ifconfig结果详解
  18. 财务说账单上少了一分钱,老板看到代码气疯了
  19. 文件函数python_Python 基础之文件 函数
  20. linux命令---top

热门文章

  1. MacBook常用的快捷键
  2. 2021年N1叉车司机考试题库及N1叉车司机作业模拟考试
  3. java文件读写的基本类_Java读写文件常用方法
  4. margin collapsing
  5. Java基础编程小案例-买飞机票
  6. 在?爬个天气预报给qq邮箱
  7. 「公开课实录」幻境视界周志强:艺术+VR,一次非冲动的完美跨界
  8. 工具猿之Linux运维命令总结以及场景运用
  9. 论文笔记-Learning to Predict Streaming Video QoE: Distortions, rebuffering and memory
  10. [Study]MyBatisPlus