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

59 阅读1分钟

[](题解 | #两个链表的第一个公共结点 Python#_牛客博客 (nowcoder.net))

# 两个链表的第一个公共结点
class Node:
    def __init__(self, element=None):
        self.element = element
        self.next = None


class Show_Node:
    # 根据输入的列表创建链表
    def single_link(self, list_):
        if not list_:
            return Node()
        for index, value in enumerate(list_):
            if index == 0:  # 首元素的插入
                head = Node(value)
                cur_ = head
            else:  # 后续元素的插入
                cur_.next = Node(value)
                cur_ = cur_.next
        return head



    # 以列表的形式查看链表
    def traverse(self, node):
        list_ = []
        while node is not None:  # 遍历所有节点
            list_.append(node.element)  # 结点元素填入列表
            node = node.next
        return list_

    # 计算链表长度
    def length_link(self, node):
        cur = node
        len_ = 0  # 计数
        while cur is not None:  # 遍历所有节点
            len_ += 1  # 计数
            cur = cur.next  # cur指向下一个节点
        return len_


class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        # 长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
        # 长度不同有公共结点,第一遍走完长度的差值就出来了,第二遍一起到公共结点;没有公共,第二遍一起到结尾NULL。
        p1 = pHead1
        p2 = pHead2
        while p1 != p2:
            if not p1:
                p1 = pHead2
            else:
                p1 = p1.next
            if not p2:
                p2 = pHead1
            else:
                p2 = p2.next
        return p1