剑指offer22 — 两个链表的第一个公共结点
题目
输入两个链表,找出他们的第一个公共结点。
分析
绿框内为待求的公共结点。
没有公共的返回None即可。两个链表的头都往后走,短的先到None停住,然后计算二者之间差的步数。之后让长的先走k步,之后长短一起走,相等时返回短的即可。
解
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
# 短链表的值,长链表的值,短链表头,长链表头
def findEqual(shortPointer,longPointer,shortPointerHead,longPointerHead):
k = 0
#寻找链表长度之间的差值
while longPointer:
longPointer=longPointer.next
k += 1
# 让较长的链表先走k步
shortPointer = shortPointerHead
longPointer = longPointerHead
for i in range(k):
longPointer = longPointer.next
while shortPointer != longPointer:
shortPointer = shortPointer.next
longPointer = longPointer.next
return shortPointer
pTmp1=pHead1
pTmp2=pHead2
while pTmp1 and pTmp2:
# 当两个链表一样长的时候
if pTmp1 == pTmp2:
return pTmp1
pTmp1=pTmp1.next
pTmp2=pTmp2.next
if pTmp1:
return findEqual(pTmp2,pTmp1,pHead2,pHead1)
if pTmp2:
return findEqual(pTmp1,pTmp2,pHead1,pHead2)
另一种利用差值的思路,代码量小:
class Listnode():
def __init__(self,x):
self.val=x
self.next=None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
if pHead1 == None or pHead2 == None:
return None
p1, p2 = pHead1, pHead2
# 一直往后走,谁先遇到None谁先到另一家的头,然后继续走,直到公共为止
while p1 != p2:
p1 = p1.next if p1 != None else pHead2
p2 = p2.next if p2 != None else pHead1
return p1