python 两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。
 
看到这道题的时候,很多人的第一反应就是采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点。如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点。而通常蛮力并不是好的方法。
 
思路:
第一种情况:相同长度有交点
两个指针一起走,步长一致,碰到第一个相同的节点 p1 == p1,退出循环,return p1。
第二种情况:相同长度无交点
两个指针一起走,直到走到最后一个节点,p1.next 和 p2.next都为 None,满足 相等的条件,退出循环,return p1。
第三种情况:不同长度有交点
两个指针一起走,当一个指针p1走到终点时,说明p1所在的链表比较短,让p1指向另一个链表的头结点开始走,直到p2走到终点,让p2指向短的链表的头结点,那么,接下来两个指针要走的长度就一样了,变成第一种情况。
第四种情况:不同长度无交点
两个指针一起走,当一个指针p1走到终点时,说明p1所在的链表比较短,让p1指向另一个链表的头结点开始走,直到p2走到终点,让p2指向短的链表的头结点,那么,接下来两个指针要走的长度就一样了,变成第二种情况。
 
 1 # -*- coding:utf-8 -*-
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6 class Solution:
 7     def FindFirstCommonNode(self, pHead1, pHead2):
 8         # write code here     
 9         
10         if not pHead1 or not pHead2:
11             return None
12         p1 = pHead1
13         p2 = pHead2
14         
15         while p1 != p2:
16             if not p1:
17                 p1 = pHead2
18             else:
19                 p1 = p1.next
20                 
21             if not p2:
22                 p2 = pHead1
23             else:
24                 p2 = p2.next
25         return p1
26 
27      
借鉴:http://blog.csdn.net/lynette_bb/article/details/
     https://www.baidu.com/link?url=R7xVATIfwdWdfoZY414Lsw2G-bAhK0uIEEooCvZh-FShhKfpqPHcy4dIr8anDHDODjeJIHIW-EMLSAAFcDxJFafN0UX2QamdZqrvHVtF9Le&wd=&eqid=d66f34b40000306b000000065a93ae50
 
 
原文地址:https://www.cnblogs.com/shunyu/p/8473416.html