第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
第5章 优化时间和空间效率
面试题39 : 数组中出现次数超过一半的数字
面试题40 : 最小的k个数
面试题42 : 连续子数组的最大和
面试题43 : 从1到n整数中1出现的次数
面试题45 : 把数组排成最小的数
面试题49 : 丑数
面试题50 : 第一个只出现一次的字符
面试题51 : 数组中的逆序对
面试题52 : 两个链表的第一个公共结点
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
牛客网
输入两个链表,找出它们的第一个公共结点。
解题思路
如果两个链表有公共节点,那么公共节点一定出现在链表尾部。从尾部开始查找,但是这是个单向链表。我们可以用栈来存储节点,分别用两个栈存储两个节点,这样两个链表的尾结点就位于两个栈的栈顶,接下来比较两个栈顶的节点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的节点。这种方法需要O(n)的空间复杂度。下面介绍一种O(1)空间复杂度方法。
首先用两个指针遍历两个链表得到他们的长度,计算两者长度差s。然后再次遍历链表,在较长的链表上先走s步,接着两个指针一起走,找到第一个相同的节点就是他们第一个公共节点。
实战
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
def findcommonnode(p):
ptemp = pHead1
while p.next:
p, ptemp = p.next, ptemp.next
p = pHead2
while p:
if p == ptemp:
return p
p, ptemp = p.next, ptemp.next
return None
if not pHead1 or not pHead2:
return None
if pHead1 == pHead2:
return pHead1
p1, p2 = pHead1, pHead2
while p1.next and p2.next:
p1, p2 = p1.next, p2.next
if p1.next:
return findcommonnode(p1)
if p2.next:
return findcommonnode(p2)
return None