36. 两个链表的第一个公共结点
36. 两个链表的第一个公共结点
题目描述
输入两个链表,找出它们的第一个公共结点。
思路
两个链表有交叉的部分,则交叉部分为公共节点,由于链表的每个节点只有唯一的一个next,所以,链表交叉后,之后的节点全部是公共节点,不会再有分叉了。
思路一:
将两个链表合并,形成pHead1+pHead2和pHead2+pHead1两个链表,这两个链表长度相等,后面的几个节点必定是相同的公共节点,分别对两个链表进行遍历,并比较当前节点,如果相等则说明这个是公共节点,返回即可得第一个公共节点。
思路二:
还有一种思路是获取链表的长度,将长的链表长出来的部分删(遍历)掉,然后再跟短链表一起遍历。由于没有给定求链表长度的函数,所以要自定义一个。
代码实现
思路一:
# -*- 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
if pHead1 == None or pHead2 == None:
return None
else:
node1, node2 = pHead1, pHead2
while(node1 != node2):
# 相当于遍历pHead1+pHead2
if(node1 != None):
node1 = node1.next
else:
node1 = pHead2
# 相当于遍历pHead2+pHead1
if(node2 != None):
node2 = node2.next
else:
node2 = pHead1
return node1 # 返回node2也可以思路二:
# -*- 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 getLenth(pHead):
if pHead == None:
return 0
lenth = 0
while(pHead.next != None):
pHead = pHead.next
lenth += 1
return lenth
if pHead1 == None or pHead2 == None:
return None
else:
node1, node2 = pHead1, pHead2
len1 = getLenth(node1)
len2 = getLenth(node2)
longer,shoter,lenDif = None,None,0
if len1>len2:
longer,shoter,lenDif = node1,node2,len1-len2
else:
longer,shoter,lenDif = node2,node1,len2-len1
# 长的链表长出来的部分删(遍历)掉
for i in range(lenDif):
longer = longer.next
# 两个等长的链表一起遍历
while(longer != shoter):
longer = longer.next
shoter = shoter.next
return longer # 返回shoter也可以
查看30道真题和解析