题目描述:
思路一(超时):
1.创建一个保存链表节点的list nodelist。
2.先将链表A中每个节点加入nodelist。
3.对链表B中每个节点,判断是否在nodelist存在,如果存在则说明找到一个交叉节点。
class Solution(object): def getIntersectionNode(self, headA, headB): if headA==None or headB==None: return None nodelist = [] while headA: nodelist.append(headA) headA = headA.next while headB: if headB in nodelist: return headB headB = headB.next return None
思路二(通过):
长度较长的链表先进行搜索。
1.分别计算出链表A和B的长度lena和lenb。
2.如果链表A更长,则链表A先进行搜索,向后lena-lenb个节点,如果链表B更长,则B先进行搜索,向后lena-lenb个节点。
3.链表A B同时向后,直到出现一个交叉节点或None。
说明:
1.如果A B两链表交叉,则交叉点之后的部分完全相同。长度较长的链表节点先向后移,直到剩余节点数和较短的链表相同,然后两个链表节点同时后移。
如下,链表B长度比A长2,B先后移两个节点到b3,然后A B会同时移动三个节点至n1
2.如果A B两链表不交叉,长度较长的链表节点先开始后移,然后两个链表节点同时后移,最终都到达None。
如下,B比A长2 无交叉,B向后移动两个节点到b3,然后A B同时后移3个节点结束。
class Solution(object): def getIntersectionNode(self, headA, headB): if headA==None or headB==None: return None lena = 0 lenb = 0 a = headA b = headB while a: lena = lena+1 a = a.next while b: lenb = lenb+1 b = b.next diff = abs(lenb-lena) if lenb>lena: for i in range(diff): headB = headB.next else: for i in range(diff): headA = headA.next while headA!=headB: headA = headA.next headB = headB.next return headA
思路三(通过):
参考:【leetcode】Python实现-160.相交链表_神不烦-CSDN博客_python相交链表
两线段之和不变?
有交叉节点情况:
链表A轨迹:a1 a2 a3 n1 n2 n3结束,此时B轨迹为b1 b2 b3 b4 b5 n1未结束
A将下一个节点设为b1继续 b1 b2 b3 b4 b5
B继续n1 n2 n3 然后将下一个节点设为a1继续 a1 a2 a3
A B会在下一个节点n1相遇
完整轨迹:a1 a2 a3 n1 n2 n3 b1 b2 b3 b4 b5 n1
b1 b2 b3 b4 b5 n1 n2 n3 b1 b2 b3 n1
无交叉节点情况:
则对A B搜索完成后会结束
注意⚠️:nodea=halfB的条件必须为nodea==None,如果设置为nodea.next==None在没有交叉节点的时候好像会进入死循环。nodeb=halfA同理。因为总会在最后一个非None节点进入下一个链表的开始,如果设置为nodea==None,会在nodea=nodeb=None时结束循环。
class Solution(object): def getIntersectionNode(self, headA, headB): nodea = headA nodeb = headB while nodea!=nodeb: nodea = headB if nodea == None else nodea.next nodeb = headA if nodeb == None else nodeb.next return nodea