1.暴力求解
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
if headA==None or headB==None:
return None
n1=headA
while(n1):
n2=headB
while(n2):
if(n1==n2):
return n1
n2=n2.next
n1=n1.next
return None
超出了时间限制,fine
2.双指针法
相当于n1和n2先走到各自的尾部(第一阶段),然后从对方的头部继续(第二阶段),如果这两个链表是相交的,那么他们一定会在第二阶段于交点处相遇,画个图能理解。
if headA==None or headB==None:
return None
n1=headA
n2=headB
while(n1!=n2):
if(n1):
n1=n1.next
else:
n1=headB
if(n2):
n2=n2.next
else:
n2=headA
return n1
3.消除长度
先求出两个链表的长度,然后从头开始,先是长的那个链表从头部向后走,短的还是在头部,直到它们剩下的长度相同,这个时候就一起开始走,如果两个链表相交,那么他们一定会同时到达交点处。
if headA==None or headB==None:
return None
n1=headA
n2=headB
if(n1==n2):
return n1
length1=0
length2=0
while(n1):
length1+=1
n1=n1.next
while(n2):
length2+=1
n2=n2.next
n1=headA
n2=headB
while(length1>length2):
n1=n1.next
length1-=1
while(length1<length2):
n2=n2.next
length2-=1
while(n1 and n2):
if(n1==n2):
return n1
n1=n1.next
n2=n2.next
4.集合
把A或B的指针全部放在一个集合,遍历另外一个链表,如果某个指针在集合中,那么他们从这个指针之后就是相交的。
if headA==None or headB==None:
return None
n1=headA
n2=headB
if(n1==n2):
return n1
set1=set()
while(n1):
set1.add(n1)
n1=n1.next
while(n2):
if(n2 in set1):
return n2
n2=n2.next
关于Python的集合操作,在https://blog.csdn.net/business122/article/details/7541486