面试题22:链表中倒数第k个节点
- 题目描述:
输入一个链表,输出该链表中倒数第k个结点。
- 详细代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or k <= 0:
return None
ahead = head
behind = None
for i in range(k - 1):
if ahead.next:
ahead = ahead.next
else:
return None
behind = head
while ahead.next:
ahead = ahead.next
behind = behind.next
return behind
面试题23:链表中环的入口节点
- 题目描述:
如果一个链表中包含环,如何找出环的入口节点?
- 详细代码:
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
pFast = pHead
pSlow = pHead
while pFast and pFast.next:
pFast = pFast.next.next
pSlow = pSlow.next
if pFast == pSlow:
break
if pFast == 0 or pFast.next == 0:
return None
pFast = pHead
while pFast != pSlow:
pFast = pFast.next
pSlow = pSlow.next
return pFast
面试题24:反转链表
- 题目描述:
输入一个链表,反转链表并输出反转后链表的头节点。
- 详细代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
ReversedHead = None
pNode = pHead
pPrev = None
while pNode:
pNext = pNode.next
if not pNext:
return pNode
pNode.next = pPrev
pPrev = pNode
pNode = pNext
return ReversedHead
面试题25:合并两个排序的链表
- 题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- 详细代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
if not pHead1:
return pHead2
if not pHead2:
return pHead1
MergedHead = None
if pHead1.val < pHead2.val:
MergedHead = pHead1
MergedHead.next = self.Merge(pHead1.next, pHead2)
else:
MergedHead = pHead2
MergedHead.next = self.Merge(pHead1, pHead2.next)
return MergedHead
面试题26:树的子结构
- 题目描述:
输入两棵二叉树A和B,判断B是不是A的子结构。
- 详细代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def HasSubtree(self, pRoot1, pRoot2):
# write code here
result = False
if pRoot1 and pRoot2:
if pRoot1.val == pRoot2.val:
result = self.HasSubtreeCore(pRoot1, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.left, pRoot2)
if not result:
result = self.HasSubtree(pRoot1.right, pRoot2)
return result
def HasSubtreeCore(self, pRoot1, pRoot2):
if not pRoot2:
return True
if not pRoot1:
return False
if pRoot1.val != pRoot2.val:
return False
return self.HasSubtreeCore(pRoot1.left, pRoot2.left) and self.HasSubtreeCore(pRoot1.right, pRoot2.right)