集合
先把第一个链表所有元素都存到集合里,再遍历第二个链表,检测当前元素是否在集合里。如果是,则找到交点
def getIntersectionNode(slef,headA,headB):
s=set()
p,q=headA,headB
while p:
s.add(p)
p=p.next
while q:
if q in s:
return q
q=q.next
return None
栈
把两个链表分别压入两个栈中,再将它们出栈并一一对比,最后一组相同的元素就是他们的交点。
def getIntersectionNode(slef,headA,headB):
s1,s2=[],[]
p,q=headA,headB
while p:
s1.append(p)
p=p.next
while q:
s2.append(q)
q=q.next
ans=None
i,j=len(s1)-1,len(s2)-1
while i>=0 and j>=0 and s1[i]==s2[j]:
ans=s1[i]
i,j=i-1,j-1
return ans
连接两个字符串
感觉有点复杂,明天再写思路
def getIntersectionNode3(self,headA,headB):
node1,node2=headA,headB
while node1!=node2:
node1=node1.next if node1 else headB
node2=node2.next if node2 else headA
return node1
差和双指针
先第一轮遍历,得La长度为L1,Lb长度为L2。
将快指针先走|L1-L2|,然后快指针和慢指针一起走,结点一样时就是公共节点。
也就是把两个链表公共节点前面不一样的长度换成一样的。
def getIntersectionNode3(self,headA,headB):
s1,s2=0,0
p,q=headA,headB
while p:
p=p.next
s1+=1
while q:
q=q.next
s2+=1
p,q=headA,headB
#长链表先走,但不确定谁更长,所以有两个循环,至少有一个循环不会执行
for i in range(s1-s2):
p=p.next
for i in range(s1-s2):
q=q.next
while p and q and p!=q:
p=p.next
q=q.next
return p