思路一:
两条相交的链表呈Y型。可以从两条链表尾部同时出发,最后一个相同的结点就是链表的第一个相同的结点。可以利用栈来实现。时间复杂度有O(m + n), 空间复杂度为O(m + n)
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
# 依次出栈,最后一个相同的就是相交节点
if not pHead1 or not pHead2:
return
stack1=self.re_stack(pHead1)
stack2=self.re_stack(pHead2)
tmp=None
while stack1 and stack2 and stack1[-1]==stack2[-1]:
tmp=stack1[-1]
stack1.pop()
stack2.pop()
return tmp
def re_stack(self,head):
#把链表的值放入栈,最后一个进入栈的是链表的尾节点
stack=[]
while head:
stack.append(head)
head=head.next
return stack
思路二:从链表头出发如何同时到达第一个相同的结点呢? 链表的长度相同就可以,其实就是走的结点数目相同。所以可以让其中长的链表先走几步,剩余的长度到短链表的长度相同。
# -*- 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
if not pHead1 or not pHead2:
return
#链表的长度
length1=self.length(pHead1)
length2=self.length(pHead2)
p1,p2=pHead1,pHead2
#让长的链表先走至两个链表相同的长度
if length1>length2:
while length1-length2>0:
p1=p1.next
length1-=1
else:
while length2-length1>0:
p2=p2.next
length2-=1
while p1 and p2:
#第一个相同的节点就是相交的节点
if p1==p2:
return p1
else:
p1=p1.next
p2=p2.next
return None
def length(self,head):
#求链表的长度
length=0
while head:
length+=1
head=head.next
return length