LeetCode链表简单题
一、21合并两个有序链表
代码如下:
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 首先对特殊情况进行处理,l1 l2 为空的时候
if not (l1 and l2) : # 这个表达式的意思只要l1 l2 不全为真就符合条件
return l1 or l2
elif l1.val > l2.val: # 判断哪一个值比较小,然后保留哪一项
l2.next = self.mergeTwoLists(l2.next,l1) # 递归思想的精髓
return l2 # 返回小的这一项
else :
l1.next = self.mergeTwoLists(l1.next,l2)
return l1
# 注意:l1 l2 表示的不是整个链表,而只是每一个结点 # 这个是别人给的题解,大佬写的很好。
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 and l2: # 判断l1 是否为空
if l1.val > l2.val : l1,l2 = l2,l1 # 始终让l1 为小值
l1.next = self.mergeTwoLists(l1.next,l2) # 递归的精髓
return l1 or l2
二、83删除链表重复的元素
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head :return head # 首先判断链表是否为空,若为空直接返回
head1 = head
l = [] # 定义一个空的列表 用来存放已经遍历过的链表结点
l.append(head.val) # 将遍历过的链表结点添加进入列表中
while head and head.next: # 当前结点和下一个结点都为真继续
if head.next.val in l : # 若下一节点的值已经在列表中
head.next = head.next.next # 进行删除操作,跳过下一节点,直接指向下下结点
else:
l.append(head.next.val) # 将结点添加进入列表
head = head.next # 进行遍历
return head1 # 返回删除重复元素后的链表
三、141环形链表
# 解题思路;利用快慢指针,一个指针快,另一个慢,若链表有环,则总有相遇的时候
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head or not head.next : # 若链表中没有元素,或者只有一个元素,则不可能成环
return False
fast = head
slow = head
while fast:
if fast.next == None: # 若快指针可以走到头,则肯定没有环
return False
else :
fast = fast.next.next # 快指针每次走两步
slow = slow.next # 慢指针走一步
if slow == fast: # 当快慢指针相遇
return True
return False # 当快指针为None时退出
四、160相交链表
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if not headA or not headB: # 若两个链表中其中一个链表为空则不可能相交
return None
length1 = 0 # 用来接收headA链表的长度
length2 = 0
h1 = headA
h2 = headB
while h1: # 遍历链表算出两个链表的长度
length1 += 1
h1 = h1.next
while h2:
length2 += 1
h2 = h2.next
if length1 > length2: # 让比较长的链表先走
for i in range(length1 - length2):
headA = headA.next
elif length1 < length2:
for i in range(length2 - length1):
headB = headB.next
while headA: # 现在两个指针处于同一位置
if headA == headB: # 判断是否为同一节点
return headA
headA = headA.next
headB = headB.next
return None
五、203移除链表元素
class Solution(object):
def removeElements(self, head, val):
"""
:type head: ListNode
:type val: int
:rtype: ListNode
"""
if not head:return head # 判断是否为空链表
head1 = head # 用head1返回新的链表
while head: # 找到第一个不需要删除的链表
if head.val == val: # 需要删除时,将head1等于head的下一节点
head1 = head.next
head = head.next
else:
break
while head and head.next: # 进行链表的遍历,进行删除所给的元素
if head.next.val == val:
head.next = head.next.next
else :
head = head.next
return head1 # 返回新的链表
六、234回文链表
# 用快慢指针的方法找到链表的中间节点,然后将后半段链表进行反转,在判断
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if not head or not head.next : # 若链表为空或为一个元素,则链表为回文链表
return True
fast = head
slow = head # 快慢指针 快指针走两步,慢指针走一步
while fast and fast.next:
fast = fast.next.next
slow = slow.next
mid = slow # 此时slow为中点指针
pre = None
# 将后半段链表表反转
while slow:
slow.next,pre,slow = pre,slow,slow.next
# 不可以分开写成三个语句,Python特有,在C语言中这样写是错误的
# 他们这三个语句的执行是相同,没有先后之分。
# 此时后半段列表的头指针为pre
while head != mid:
if head.val != pre.val:
return False
pre = pre.next
head = head.next
return True
LeetCode链表简单题的更多相关文章
- leetcode 链表类型题总结
链表测试框架示例: // leetcodeList.cpp : 定义控制台应用程序的入口点.vs2013 测试通过 // #include "stdafx.h" #include ...
- leetcode 63 简单题
题目很水... 直接放代码了 int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridRowSize, int obstacl ...
- 这样leetcode简单题都更完了
这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...
- leetcode简单题6
今天的华师 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...
- LeetCode 75,90%的人想不出最佳解的简单题
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的44篇文章,我们一起来看下LeetCode的75题,颜色排序 Sort Colors. 这题的官方难度是Medi ...
- 链表算法题之中等级别,debug调试更简单
文章简述 大家好,本篇是个人的第 5 篇文章 从本篇文章开始,分享关于链表的题目为中等难度,本次共有 3 道题目. 一,两数相加 1.1 题目分析 题中写到数字是按照逆序的方式存储,从进位的角度看,两 ...
- 【python】Leetcode每日一题-旋转链表
[python]Leetcode每日一题-旋转链表 [题目描述] 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例1: 输入:head = [1,2,3,4,5] ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素
[python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素2
[python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...
随机推荐
- Linux本机和远程服务器之间文件的上传和下载 rz sz
tar zxvf lrzsz-0.12.20.tar.gz 解压安装包 下载地址:链接:https://pan.baidu.com/s/1KMS1QlyOhpXiYeaWdNBAyw 提取码:08 ...
- Vue使用 weui picker 弹出框不消失
前言 最近使用 weui 里面的 datepicker 组件的时候遇到了一个问题: 弹出来 选择年月日的框之后,直接点击导航上的“返回” 按钮,picker 选框不消失,也就是弹出框不消失 weui. ...
- tar命令--数据归档(一)
虽然zip命令能够很好的将数据压缩和归档到单个文件,蛋挞不是linux 和unix的标准归档工具. ta命令最开始是用来将文件写到磁盘设备上的归档.然而他也能把输出写道文件里. 你会发现这个可选参数是 ...
- CodeForces-916B-Jamie and Binary Sequence(changed after round)(构造)
链接: https://vjudge.net/problem/CodeForces-916B 题意: Jamie is preparing a Codeforces round. He has got ...
- 约瑟夫环(CVTE、网易2014.3.16笔试题offerP228)
题目:0,1,2,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂 ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs
题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...
- LeetCode - 乘积最大子串
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子串(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: ...
- LCA模板 ( 最近公共祖先 )
LCA 有几种经典的求取方法.这里只给出模板,至于原理我完全不懂. 1.RMQ转LCA.复杂度O(n+nlog2n+m) 大致就是 DFS求出欧拉序 => 对欧拉序做ST表 => LCA( ...
- BZOJ 1901 洛谷 P2617 ZOJ 2112 Dynamic Rankings
以下时空限制来自zoj Time limit 10000 ms Memory limit 32768 kB OS Linux Source Online Contest of Christopher' ...
- 运行roslaunch启动节点报错找不到节点
报错信息: ERROR: cannot launch node of type [${package_name}/${package_name}_node]: can't locate node [$ ...