输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路一:
- 使用两个头结点遍历所有节点存入两个列表中
- 找出两个列表中第一个重复的元素
- 返回重复的元素
# 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
nodeList1 = []
nodeList2 = []
nodePointer1 = pHead1
nodePointer2 = pHead2
while nodePointer1:
nodeList1.append(nodePointer1)
nodePointer1 = nodePointer1.next
while nodePointer2:
nodeList2.append(nodePointer2)
nodePointer2 = nodePointer2.next
for i in nodeList1:
if i in nodeList2:
return nodeList2[nodeList2.index(i)]
思路二:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
pTmp1 = pHead1
pTmp2 = pHead2
while pTmp1 and pTmp2:
#当两个链表一样长时直接返回头结点
if pTmp1 == pTmp2:
return pTmp1
pTmp1 = pTmp1.next
pTmp2 = pTmp2.next
if pTmp1: #如果pTmp1是长的链表 k为差值即两个链表相差多少
k = 0
#寻找出长度链表之间的差值
while pTmp1:
pTmp1 = pTmp1.next
k += 1
pTmp1 = pHead1
pTmp2 = pHead2
#先让长的那个走K步
for i in range(k):
pTmp1 = pTmp1.next
while pTmp1 != pTmp2:
pTmp1 = pTmp1.next
pTmp2 = pTmp2.next
return pTmp1
if pTmp2: #如果pTmp1是长的链表 k为差值即两个链表相差多少
k = 0
#寻找出长度链表之间的差值
while pTmp2:
pTmp2 = pTmp2.next
k += 1
pTmp1 = pHead1
pTmp2 = pHead2
#先让长的那个走K步
for i in range(k):
pTmp2 = pTmp2.next
while pTmp1 != pTmp2:
pTmp1 = pTmp1.next
pTmp2 = pTmp2.next
return pTmp2