''' 题目描述 输入两个链表,找出它们的第一个公共结点。 思路一: 先求出每个链表的长度,分别为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