1.1 题目:反转链表:输入一个链表,反转链表后,输出新链表的表头。
1.2 思路:这道题,我们要做到的是反转链表,我们的思路是将前一个节点与后一个节点断开,然后让后一个节点指向前一个节点,这个过程就需要节点引用(可以理解为指针)来确定记录当前操作节点的前一个节点和后一个节点。
1.3 代码:
1 # -*- coding:utf-8 -*- 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 class Solution: 7 # 返回ListNode 8 def ReverseList(self, pHead): 9 # write code here 10 if not pHead or not pHead.next: 11 return pHead 12 last = None 13 while pHead: 14 tmp = pHead.next 15 pHead.next = last 16 last = pHead 17 pHead = tmp 18 return last
2.1 题目:合并两个排序列表:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
2.2 思路:
先判断输入的链表是否为空的指针。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。
两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现。
2.3 代码:
1 # -*- coding:utf-8 -*- 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 class Solution: 7 # 返回合并后列表 8 def Merge(self, pHead1, pHead2): 9 # write code here 10 if not pHead1: 11 return pHead2 12 if not pHead2: 13 return pHead1 14 pMergeHead = None 15 if pHead1.val < pHead2.val: 16 pMergeHead = pHead1 17 pMergeHead.next = self.Merge(pHead1.next, pHead2) 18 else: 19 pMergeHead = pHead2 20 pMergeHead.next = self.Merge(pHead1, pHead2.next) 21 return pMergeHead
3.1 题目:树的子结构:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
3.2 思路:要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和B的根结点的值一样的结点R,第二步再判断树A中以R为根节点的子树是不是包含和树B一样的结构。这里使用递归的方法即可。
3.3 代码:
1 # -*- coding:utf-8 -*- 2 # class TreeNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.left = None 6 # self.right = None 7 class Solution: 8 def HasSubtree(self, pRoot1, pRoot2): 9 # write code here 10 if pRoot1 == None or pRoot2 == None: 11 return False 12 return self.subtree(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2) 13 def subtree(self, A, B): 14 if B == None: 15 return True 16 if A == None or A.val != B.val: 17 return False 18 return self.subtree(A.left, B.left) and self.subtree(A.right, B.right)