题目描述
输入两个链表,找出它们的第一个公共结点。
解题思路
看到这道题之后,第一反应是用利用两个链表的长度差来做。如果两个链表有公共节点,那两个链表共用公共节点之后的部分。计算两个链表的长度差diff
,让较长的链表前进diff
后,这两个链表同时同步向后移动,直至两个链表的节点相等。
def FindFirstCommonNode(self, pHead1, pHead2):
len1 = self.getChainLen(pHead1)
len2 = self.getChainLen(pHead2)
if len2 > len1:
pHead1, pHead2 = pHead2, pHead1
diff = abs(len1-len2)
while diff > 0:
pHead1 = pHead1.next
diff -= 1
while pHead1 != pHead2:
pHead1 = pHead1.next
pHead2 = pHead2.next
return pHead1
def getChainLen(self, Head):
chainLen = 0
while Head:
chainLen += 1
Head = Head.next
return chainLen
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
想法一:
遍历第一个链表,将所有元素添加到列表当中,遍历第二个链表,拿节点查找是否存在于列表中,如果找到了公共节点,则返回该节点,如果无,返回None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
list1 = []
while pHead1:
list1.append(pHead1.val)
pHead1 = pHead1.next
while pHead2:
if pHead2.val in list1:
return pHead2
pHead2 = pHead2.next
return None
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
想法二:
如果两个链表长度一样,则正常遍历,找到相同的或者不存在。
如果两个链表长度不同,则首先短的遍历结束后会从另一个链表开头开始遍历,而当另一个节点遍历结束后从另一个链表头开始遍历时,这两个链表的差则会消除。
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
p1 = pHead1
p2 = pHead2
while p1 != p2:
p1 = pHead2 if p1 is None else p1.next
p2 = pHead1 if p2 is None else p2.next
return p1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8