【题目】输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
【思路】首先如果两个链表是一样长的,只需要挨个比较,不一样都想后移一位,相同就输出当前节点。所以主要需要考虑的是不一样长的情况。
对于两个链表不一样长,因为他们有公共节点,所以公共节点后面的是一样的,长度的差别在公共节点的前面,首先让两个链表的指针挨个往后移动,直至一个链表为空,然后将不为空的链表拿出来,让其往后移动直至空,记录循环的次数k,然后让长链表先移动该k步,此时两个链表一样长了,进行逐项比对即可。
【代码实现】
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
def findequal(longPointer, longHead, shortHead):
k = 0
#此时的longPointer指的是长的链表多出来的那一部分
while longPointer:
longPointer = longPointer.next
k += 1
longPointer = longHead
shortPointer = shortHead
#让长的链表先走k步,使两条链表一样长
for i in range(k):
longPointer = longPointer.next
while shortPointer != longPointer:
shortPointer = shortPointer.next
longPointer = longPointer.next
return longPointer
pTmp1 = pHead1
pTmp2 = pHead2
while pTmp1 and pTmp2:
# 若长度相同,直接逐项比较
if pTmp1 == pTmp2:
return pTmp1
pTmp1 = pTmp1.next
pTmp2 = pTmp2.next
if pTmp1:
return findequal(pTmp1, pHead1, pHead2)
if pTmp2:
return findequal(pTmp2, pHead2, pHead1)