輸入兩個(gè)鏈表,找出它們的第一個(gè)公共結(jié)點(diǎn)。
基本思路:
兩個(gè)鏈表若有相同的節(jié)點(diǎn),則相同節(jié)點(diǎn)后的所有節(jié)點(diǎn)都相同,所以兩個(gè)鏈表一定是
"Y"型的,而不可能是"X" 型的。因此如果兩個(gè)鏈表的最后一個(gè)幾點(diǎn)不同,則一定不會(huì)有重合的部分。
假設(shè)一個(gè)鏈表比另一個(gè)長(zhǎng)k個(gè)節(jié)點(diǎn),則長(zhǎng)鏈表的前k個(gè)節(jié)點(diǎn)一定不會(huì)有我們想要的節(jié)點(diǎn),所以先將長(zhǎng)鏈表的指針指向k+1個(gè)節(jié)點(diǎn),短鏈表指針指向第一個(gè)節(jié)點(diǎn),同步遍歷,若遇到相同的節(jié)點(diǎn),則后面所有節(jié)點(diǎn)對(duì)應(yīng)相同。
# -*- 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
len1 ,len2 = 0,0
p1,p2 = pHead1,pHead2
while p1 != None:
len1 += 1
p1 = p1.next
while p2 != None:
len2 += 1
p2 = p2.next
if p1 != p2:
return None
if len1 > len2:
longlist ,shortlist = pHead1,pHead2
else :
longlist,shortlist = pHead2,pHead1
for i in range(abs(len1-len2)):
longlist = longlist.next
while longlist!=shortlist:
longlist,shortlist = longlist.next,shortlist.next
return longlist