from typing import List
classListNode():def__init__(self, val, next=None):
self.val = val
self.next = next
classSolution:# 反转链表defreverseList(head: ListNode) -> ListNode:
last = Nonewhile head:
head.next, last, head = last, head, head.next
return last
# 顺序打印链表defprintList(self,head: ListNode) -> List[int]:
res = []
while head:
res.append(head.val)
head = head.next
return res
# UT
lst = ListNode(0,ListNode(1,ListNode(2,ListNode(3,ListNode(4)))))
print(Solution().printList(lst)) # 顺打印
print(Solution().printList(lst)[::-1]) # 反向打印
5. 删除排序链表中的重复元素
classListNode():def__init__(self, val, next=None):
self.val = val
self.next = next
defdelDuplicates(head: ListNode) -> ListNode:
node = head
while node and node.next:
if node.val == node.next.val:
node.next = node.next.next
else:
node = node.next
return head
classTreeNode(object):def__init__(self, x):
self.val = x
self.left = None
self.right = NonedeflowestCommonAncestor(root, p, q):ifnot root: return root
if root.val == p.val or root.val == q.val: return root
l = self.lowestCommonAncestor(root.left, p, q)
r = self.lowestCommonAncestor(root.right, p, q)
if l and r: return root
if l: return l
if r: return r
8. 重建二叉树
from typing import List
classTreeNode:def__init__(self, x, l=None, r=None):
self.val = x
self.left = l
self.right = r
classSolution:# 通过前序、中序defbuildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if len(preorder) ==0:
returnNone
root_val = preorder[0]
i = 0while inorder[i] != root_val:
i += 1
left_tree = self.buildTree(preorder[1:i+1], inorder[:i]) if i > 0elseNone
right_tree = self.buildTree(preorder[i+1:],inorder[i+1:]) if i < len(preorder) elseNone
root = TreeNode(root_val)
root.left = left_tree
root.right = right_tree
return root