'''
题目描述
输入两个链表,找出它们的第一个公共结点。
思路一:
先求出每个链表的长度,分别为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 两个链表的第一个公共结点
最新推荐文章于 2024-05-23 12:28:11 发布
博客围绕输入两个链表,找出第一个公共结点展开。介绍了两种思路,一是先求链表长度,让长链表指针多走差值步数,找到相同节点;二是将链表节点存入栈,从后向前遍历,找到最后一个相同节点即第一个公共节点,还给出了对应代码实现。


1403

被折叠的 条评论
为什么被折叠?



