leetcode 160. 相交链表 python

题目描述:

leetcode 160. 相交链表 python_第1张图片

leetcode 160. 相交链表 python_第2张图片 

leetcode 160. 相交链表 python_第3张图片 

leetcode 160. 相交链表 python_第4张图片 

思路一(超时): 

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 160. 相交链表 python_第5张图片

思路三(通过):

参考:​​​​​​【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

leetcode 160. 相交链表 python_第6张图片

 

 

 

 

你可能感兴趣的:(leetcode链表,python,leetcode,链表)