链表
#6.py
# 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
# 示例 1:
# 输入:head = [1,3,2]
# 输出:[2,3,1]
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
# res=[]
# while head:
# res.append(head.val)
# head=head.next
# return res[::-1]
#辅助栈
res=[]
stack=[]
while head:
stack.insert(0,head)
head=head.next
while stack:
res.append(stack.pop(0).val)
return res
#18.py
# 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
# 返回删除后的链表的头节点。
# 注意:此题对比原题有改动
# 示例 1:
# 输入: head = [4,5,1,9], val = 5
# 输出: [4,1,9]
# 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
# 示例 2:
# 输入: head = [4,5,1,9], val = 1
# 输出: [4,5,9]
# 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
dummy=ListNode(-1)
dummy.next=head
if head.val==val:return head.next
while head and head.next:
if head.next.val==val:
head.next=head.next.next
head=head.next
return dummy.next
#22.py
# 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
fast=head
slow=head
for i in range(k):
fast=fast.next
while fast:
slow=slow.next
fast=fast.next
return slow
#24.py
# 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
# 示例:
# 输入: 1->2->3->4->5->NULL
# 输出: 5->4->3->2->1->NULL
# 限制:
# 0 <= 节点个数 <= 5000
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head:return []
p=head
q=p.next
while q:
tmp=q.next
q.next=p
p=q
q=tmp
head.next=None
return p
#25.py
# 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
# 示例1:
# 输入:1->2->4, 1->3->4
# 输出:1->1->2->3->4->4
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
l=ListNode(-1)
head=l
while l1 and l2:
if l1.val<=l2.val:
l.next=l1
l1=l1.next
else:
l.next=l2
l2=l2.next
l=l.next
while l1:
l.next=l1
l1=l1.next
l=l.next
while l2:
l.next=l2
l2=l2.next
l=l.next
return head.next
#35.py
#请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
def dfs(root):
if not root:return
if root in visited:
return visited[root]
copy=Node(root.val,None,None)
visited[root]=copy
copy.next=dfs(root.next)
copy.random=dfs(root.random)
return copy
visited={}
return dfs(head)
#36.py
#输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
def dfs(cur):
if not cur:return
dfs(cur.left)
if self.pre:
self.pre.right=cur
cur.left=self.pre
else:
self.head=cur
self.pre=cur
dfs(cur.right)
if not root:return
self.pre=None
dfs(root)
self.head.left=self.pre
self.pre.right=self.head
return self.head
#52.py
#输入两个链表,找出它们的第一个公共节点。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
p=headA
q=headB
while p!=q:
if not p:
p=headB
else:
p=p.next
if not q:
q=headA
else:
q=q.next
return q
#53_1.py
# 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
#
# 示例 1:
# 输入: [0,1,3]
# 输出: 2
# 示例 2:
# 输入: [0,1,2,3,4,5,6,7,9]
# 输出: 8
class Solution:
def missingNumber(self, nums: List[int]) -> int:
left=0
right=len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]==mid:
left=mid+1
else:
right=mid-1
return left