交叉链表求交点

#-*- 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   # 如果没有交点,程序就走到了这里

 

posted on 2018-09-11 18:06  欢喜等大年  阅读(379)  评论(0编辑  收藏  举报

导航