datawhale-leetcode打卡:第026~037题
反转链表(leetcode 206)
这个题目我就比较流氓了,干脆新建链表翻转过来算了。但是完蛋,超出内存限制,那我就只能两两换了。这里比较大的技巧就是可以用一个空节点进行置换。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
p,q=head,None
while p:
p.next,q,p=q,p,p.next
return q
反转链表II(leetcode 092)
这个还是一样的思想,用空节点的方法解决这个问题。
class Solution:
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
p0 = dummy = ListNode(next=head)
for _ in range(left - 1):
p0 = p0.next
pre = None
cur = p0.next
for _ in range(right - left + 1):
nxt = cur.next
cur.next = pre # 每次循环只修改一个 next,方便大家理解
pre = cur
cur = nxt
# 见视频
p0.next.next = cur
p0.next = pre
return dummy.next
K个一组反转链表(leetcode 025)
这个题号我怎么感觉这么乱呢,难度递增题号递减是吧
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
n = 0
cur = head
while cur:
n += 1 # 统计节点个数
cur = cur.next
p0 = dummy = ListNode(next=head)
pre = None
cur = head
while n >= k:
n -= k
for _ in range(k): # 同 92 题
nxt = cur.next
cur.next = pre # 每次循环只修改一个 next,方便大家理解
pre = cur
cur = nxt
# 见视频
nxt = p0.next
nxt.next = cur
p0.next = pre
p0 = nxt
return dummy.next
回文链表(leetcode 234)
这个题我终于可以使用流氓方法了哈哈哈哈
class Solution:
def isPalindrome(self, head: Optional[ListNode]) -> bool:
s=[]
while head.next:
s.append(head.val)
head=head.next
s.append(head.val)
return s==s[::-1]
合并两个有序链表(leetcode 021)
这个题本质是一个归并排序,遵循数据结构里面的,先排,然后谁剩下就把谁拼最后。
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
p=ListNode()
newhead=ListNode(next=p)
if list1==None and list2==None:
return None
if list1==None:
return list2
if list2==None:
return list1
while list1 and list2:
if list1.val>list2.val:
p.next=list2
list2=list2.next
else:
p.next=list1
list1=list1.next
p=p.next
if list1:
p.next=list1
else:
p.next=list2
return newhead.next.next
排序链表(leetcode 148)
这个题比较简单,跟上面的方法一样
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
s=[]
p=ListNode(next=head)
q=ListNode(next=p)
while head:
s.append(head.val)
head=head.next
s.sort()
p=p.next
for i in s:
p.val=i
p=p.next
return q.next.next
合并K个有序链表(leetcode 023)
这个题我们参考21题的代码进行融合就可以了。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
# 21. 合并两个有序链表
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
cur = dummy = ListNode() # 用哨兵节点简化代码逻辑
while list1 and list2:
if list1.val < list2.val:
cur.next = list1 # 把 list1 加到新链表中
list1 = list1.next
else: # 注:相等的情况加哪个节点都是可以的
cur.next = list2 # 把 list2 加到新链表中
list2 = list2.next
cur = cur.next
cur.next = list1 if list1 else list2 # 拼接剩余链表
return dummy.next
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
m = len(lists)
if m == 0: return None # 注意输入的 lists 可能是空的
if m == 1: return lists[0] # 无需合并,直接返回
left = self.mergeKLists(lists[:m // 2]) # 合并左半部分
right = self.mergeKLists(lists[m // 2:]) # 合并右半部分
return self.mergeTwoLists(left, right) # 最后把左半和右半合并
环形链表(leetcode 141)
这个题目昨天面试的时候被问到过,马上就想到了快慢指针法。昨天刚手搓过一回
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
p=ListNode(next=head)
q=ListNode(next=head)
while p and q:
p=p.next
q=q.next.next
if p==q:
return True
return False
环形链表II(leetcode 142)
这个解法是昨天面试搓的另一个方法。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> bool:
visited = set()
temp = head
while temp:
if temp in visited:
return temp
visited.add(temp)
temp = temp.next
return None
相交链表(leetcode 160)
这道题是以往的一道考研原题,以前复习考研的时候做过。这道题应该是408在2011年的一道题目改编,当时是以字母的形式考察相交链表。本质上就是先移动长表,然后一起走。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
p1=ListNode(next=headA)
q1=ListNode(next=headB)
p=ListNode(next=headA)
q=ListNode(next=headB)
len1,len2=0,0
while p1:
len1+=1
p1=p1.next
while q1:
len2+=1
q1=q1.next
if len1>len2:
for i in range(len1-len2):
p=p.next
if len2>len1:
for i in range(len2-len1):
q=q.next
for i in range(min(len1,len2)-1):
if p.next==q.next:
return p.next
p=p.next
q=q.next
return None
删除链表的倒数第N个节点(leetcode 019)
疯狂try&except去调试最后跑过了几个案例。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
p=ListNode(next=head)
q=ListNode(next=head)
h=ListNode(next=head)
count=0
for i in range(n):
try:
q=q.next
count+=1
except:
return None
try:
while q.next:
p=p.next
q=q.next
count+=1
except:
pass
print(count)
if count==n:
return None
p.next=p.next.next
return h.next
重排链表(leetcode 143)
解法仍然是快慢指针法。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: Optional[ListNode]) -> None:
"""
Do not return anything, modify head in-place instead.
"""
fast = slow = head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
cur = slow.next
slow.next = None
pre = None
while cur:
t = cur.next
cur.next = pre
pre, cur = cur, t
cur = head
while pre:
t = pre.next
pre.next = cur.next
cur.next = pre
cur, pre = pre.next, t
datawhale-leetcode打卡:第026~037题的更多相关文章
- leetcode打卡
leetcode刷题打卡 刷题链接 夸夸群 刷题记录链接 期中颜色不一样的,是刷题中遇到问题的,以后需要强化 [x] 6.1 打卡 [x] 6.2 打卡 中间因个人原因没做题,后面慢慢补上 [x] 6 ...
- 【LeetCode】数学(共106题)
[2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...
- 【LeetCode】树(共94题)
[94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...
- LeetCode (85): Maximal Rectangle [含84题分析]
链接: https://leetcode.com/problems/maximal-rectangle/ [描述] Given a 2D binary matrix filled with '0's ...
- HDU 2546 饭卡(01背包裸题)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- 【LeetCode】BFS(共43题)
[101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...
- 【LeetCode】Recursion(共11题)
链接:https://leetcode.com/tag/recursion/ 247 Strobogrammatic Number II (2019年2月22日,谷歌tag) 给了一个 n,给出长度为 ...
- 【LeetCode动态规划#11】打家劫舍系列题(涉及环结构和树形DP的讨论)
打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻 ...
- 【一天一道LeetCode】#100. Same Tree(100题大关)
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- LeetCode 136. Single Number C++ 结题报告
136. Single Number -- Easy 解答 相同的数,XOR 等于 0,所以,将所有的数字 XOR 就可以得到只出现一次的数 class Solution { public: int ...
随机推荐
- Mybatis【6】-- Mybatis插入数据后自增id怎么获取?
代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning/tree/master/mybatis-05-CURD ] 需要声明的是:此Myba ...
- [笔记]博弈论 & SG 函数
一直没学结果今天被创了. 一些定义: \(\text{mex}\{S\}\):集合 \(S\) 中最小的没有出现过的非负整数. \(\oplus\):按位异或.也叫做 \(\text{xor}\). ...
- 微软中文输入法带来的一点小坑,导致arcgispro输入中文异常
有同事反映,在Pro中新建要素类时,没办法设定名称为"新建",会自己变成不完整的拼音. 查看了一下,确有此事. 在相同的界面里还有其他输入框,却没有这种情况. 研究了一下,发现是输 ...
- element-ui el-dialog中套el-dialog被遮罩遮盖的问题
添加 append-to-body 属性 具体见官方文档 入口
- 零基础学习人工智能—Python—Pytorch学习(十三)
前言 最近学习了一新概念,叫科学发现和科技发明,科学发现是高于科技发明的,而这个说法我觉得还是挺有道理的,我们总说中国的科技不如欧美,但我们实际感觉上,不论建筑,硬件还是软件,理论,我们都已经高于欧美 ...
- MeteoInfo-Java解析与绘图教程(二)
MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...
- ChatGPT生成测试用例的最佳实践(三)
还记得在第1章,我们利用ChatGPT生成的业务用例吗?这种业务用例生成方式其实和场景法用例设计十分相似,我们是不是也可以直接将业务用例输入ChatGPT,让它输出测试用例呢?笔者输入相关提示词让其补 ...
- 08C++选择结构(2)
一.逻辑变量 教学视频 存储类似灯亮或灯灭.是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量. 逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真) ...
- 数据万象 | AIGC 存储内容安全解决方案
AIGC(人工智能生产内容) 已经成为与PGC(专业生产内容).UGC(用户生产内容)并驾齐驱的内容生产方式.由于 AI 的特性,AIGC在创意.个性化.生产效率等方面具有独特的优势,这些优势可以使得 ...
- spring 项目实现带请求链路id的日志记录
我们在做java项目的时候通常需要通过请求日志来排查定位线上问题,在日志比较多而我们又需要查找整个请求的全部日志的时候会比较困难.所以,就需要在日志记录的时候讲同一个请求的关键日志用同一个唯一标识串联 ...