如题,题目要求找寻俩个单链表的第一个公共节点,如果有公共节点,则返回这个公共节点,否则返回None
首先,分析问题,单链表如果有公共节点,即肯定是这样的
常规做法:首先看哪个链表长,长链表先走(他们的差)步,然后再一起遍历,有公共节点则返回,没有返回None,但是这种太麻烦了,你还得分别遍历俩个链表,分别求其长度,求到长度以后,然后再开始遍历。有兴趣的写一下吧。
今天要介绍的这种方法,很简洁。
新方法:直接遍历,就是我判断终止的条件是俩个节点相同,链表1和链表2分别开始遍历,链表1如果遍历到尾,让它指向链表2的头。同理,链表2如果遍历到了尾,让它指向链表1的头。。。那这样的话,长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL,长度不同有公共结点,第一遍差值就遍历出来了,所以第二遍一定会一起到公共结点;没有公共,一起到结尾NULL
下面展示代码
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def FindFirstCommonNode(pHead1, pHead2):
# write code here
p1, p2 = pHead1, pHead2
while p1 != p2:
p1 = pHead2 if p1 == None else p1.next
p2 = pHead1 if p2 == None else p2.next
return p1