牛客网上的剑指 offer的在线编程:
题目描述
输入两个链表,找出它们的第一个公共结点。
思路:
第一种情况:相同长度有交点
两个指针一起走,步长一致,碰到第一个相同的节点 p1 == p1,退出循环,return p1。
第二种情况:相同长度无交点
两个指针一起走,直到走到最后一个节点,p1.next 和 p2.next都为 None,满足 相等的条件,退出循环,return p1。
第三种情况:不同长度有交点
两个指针一起走,当一个指针p1走到终点时,说明p1所在的链表比较短,让p1指向另一个链表的头结点开始走,直到p2走到终点,让p2指向短的链表的头结点,那么,接下来两个指针要走的长度就一样了,变成第一种情况。
第四种情况:不同长度无交点
两个指针一起走,当一个指针p1走到终点时,说明p1所在的链表比较短,让p1指向另一个链表的头结点开始走,直到p2走到终点,让p2指向短的链表的头结点,那么,接下来两个指针要走的长度就一样了,变成第二种情况。
# -*- 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 not pHead1 or not pHead2: return None p1, p2 = pHead1, pHead2 while p1 != p2: p1 = pHead2 if not p1 else p1.next p2 = pHead1 if not p2 else p2.next return p1