交叉链表求交点
#-*- coding:utf-8 -*- """ 链表无环判断是否相交: 问题:给定两个单链表(假设链表不存在环),判断两个链表是否相交,如果不相交返回null,如果相交, 则给出相交的第一个交点; 分析:因为链表的特殊存储结构,使得其在存储结构上如果交叉则一定为“Y"或者”V"型,不可能为“X"型, 所以相交只需要求出第一个交点; 思路:可以先找到链表p1、p2的最后一个节点(各自遍历得到),同时记录节点数量a、b;然后判断最后一个 节点是否相同,如果不相同则不想交;如果相同,则从长链表的|a-b|+1个节点和短链表的第一个节点 开始比较是否相等,不相等就分别移动到下一个节点进行比较,直到找到交叉点。 判断是否有交点的用途:这是因为一旦两个链表出现相交的情况,就可能发生这样的情况,程序释放了链表p1的 所有节点,这样就导致了另一个与之有相交节点的链表p2中的节点也被释放了,而p2的 使用者,可能并不知道事实的真相,这回带来很大的麻烦。 """ class ListNode: def __init__(self, elem,next_ = None): self.elem = elem self.next = next_ def node(l1, l2): length1, length2 = 0, 0 # 求两个链表长度 while l1.next: l1 = l1.next length1 += 1 while l2.next: l2 = l2.next length2 += 1 # 长的链表先走,走到从尾端数与短的链表相同长度的位置,然后两个链表开始比较 if length1 > length2: for _ in range(length1 - length2): l1 = l1.next else: for _ in range(length2 - length1): l2 = l2.next min_len = min(length1,length2) for _ in range(min_len): if l1 == l2: return l1 #如果有交点在这里就返回了 else: l1 = l1.next l2 = l2.next return None # 如果没有交点,程序就走到了这里