解题思路:
根据链表属性,若两个链表有公共节点,那从第一个公共节点开始,后面的节点都是一样的,所以两个链表呈Y行分布。
思路是:先计算两个链表的长度,并分别放入堆栈中,再从后往前比较两个链表的节点是否相同,第一个不同节点的next就是第一个相同节点;
注意特殊情况:短的链表的第一个节点为公共节点。
ps:题目——{1,2,3,4}{6,7}{8,9}表示
第一个链表是 {1,2,3,4,8,9}
第二个链表是{6,7,8,9}
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):# write code here
if pHead1 and pHead2:
list1 = []
list2 = []
while pHead1:
list1.append(pHead1)
pHead1 = pHead1.next
while pHead2:
list2.append(pHead2)
pHead2 = pHead2.next
for i in range(min(len(list1),len(list2))):
if list1[-1-i] != list2[-1-i]:
return list1[-1-i].next
if len(list1)<len(list2):
return list1[0]
else:
return list2[0]
else:
return None
看了别人的答案,有一个很好:
链接:https://www.nowcoder.com/questionTerminal/6ab1d9a29e88450685099d45c9e31e46
来源:牛客网
有个思路,不需要存储链表的额外空间。也不需要提前知道链表的长度。看下面的链表例子:
0
-
1
-
2
-
3
-
4
-
5
-
null
a
-
b
-
4
-
5
-
null
代码的ifelse语句,对于某个指针p1来说,其实就是让它跑了连接好的的链表,长度就变成一样了。
如果有公共结点,那么指针一起走到末尾的部分,也就一定会重叠。看看下面指针的路径吧。
p1:
0
-
1
-
2
-
3
-
4
-
5
-
null(此时遇到ifelse)
-
a
-
b
-
4
-
5
-
null
p2: a
-
b
-
4
-
5
-
null(此时遇到ifelse)
0
-
1
-
2
-
3
-
4
-
5
-
null
因此,两个指针所要遍历的链表就长度一样了!
class
Solution:
def
FindFirstCommonNode(
self
, pHead1, pHead2):
p1,p2
=
pHead1,pHead2
while
p1!
=
p2:
p1
=
p1.
next
if
p1
else
pHead2
p2
=
p2.
next
if
p2
else
pHead1
return
p1