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

'''
题目描述
输入两个链表,找出它们的第一个公共结点。
思路一:
先求出每个链表的长度,分别为a+n和b+n
n表示两个链表公共部分的长度,从第一个公共节点向后的每个节点都是两个链表的公共节点
也就是说从第一个相同的公共节点往后的所有节点都相同
用指针1和指针2分别记录两个列表中当前感兴趣的位置索引值
则如果a>b,相当于让指针1比指针2多走a-b步,则找到第一个两个指针所指向的内容相同的地方就是两个链表的第一个公共节点
思路二:
对于链表1和链表2,将链表的每个节点分别存储到两个栈stack1和stack2中
然后从最后一个节点(即栈顶元素)开始从后向前遍历原始链表中的元素
相当于从原始的两个链表中最后一个节点开始遍历,则最后一个元素必然是两个链表最后一个公共节点
向前遍历得到的最后一个相同的节点就是(从前向后遍历两个链表的)第一个公共节点
'''
# -*- 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
        len_1=0
        len_2=0
        pHead1_copy=pHead1
        pHead2_copy=pHead2
        while pHead1_copy:
            len_1+=1
            pHead1_copy=pHead1_copy.next
        while pHead2_copy:
            len_2+=1
            pHead2_copy=pHead2_copy.next
        if len_1>len_2:
            start1=len_1-len_2
            # start2=0
            for i in range(start1):
                pHead1=pHead1.next
            while(pHead1!=pHead2):
                pHead1=pHead1.next
                pHead2=pHead2.next
            return pHead1
        elif len_2>len_1:
            start2=len_2-len_1
            # start1=0
            for i in range(start2):
                pHead2=pHead2.next
            while(pHead1!=pHead2):
                pHead1=pHead1.next
                pHead2=pHead2.next
            return pHead1
        else:
            while (pHead1!= pHead2):
                pHead1 = pHead1.next
                pHead2 = pHead2.next
            return pHead1

# -*- 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
        stack1=[]
        stack2=[]

        p1,p2=pHead1,pHead2
        while p1:
            stack1.append(p1)
            p1=p1.next
        while p2:
            stack2.append(p2)
            p2=p2.next
        while(stack1 and stack2 and stack1[-1]==stack2[-1]):
            stack1.pop(-1)
            stack2.pop(-1)
        if not stack1:
            return pHead1
        if not stack2:
            return pHead2
        return stack1[-1].next

你可能感兴趣的:(python,offer)