leetcode题解之相交链表

寵の児 提交于 2020-01-26 15:00:38

'''

编写一个程序,找到两个单链表相交的起始节点。

注意:

如果两个链表没有交点,返回 null.

在返回结果后,两个链表仍须保持原有的结构。

可假定整个链表结构中没有循环。

程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

 

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

'''

双指针法算法说明:两个链表长度不一定相等,但是拼接在一起以后一定等长。pA和pB开始分别指向hA和hB,然后分别遍历两个链表。

假设链表hA比hB长,则当pB指向None时,pA仍指向链表hA的某个结点。接下来pA继续后移一位,pB指向hA。

二者继续后移,则当pA指向None时,pB仍指向链表hA的某个结点。接下来pB继续后移一位,pA指向hB,此时pA和pB对齐了。

之后二者继续后移,当pA==pB时,说明二者指向了同一结点(也可能同时指向了None),循环结束。

# Definition for singly-linked list.

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

 

class Solution:

    '''算法1:暴力枚举

    执行用时: 超出时间限制

    内存消耗: 17.0 MB, 在所有 python3 提交中击败了23.80%的用户

    '''

    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:

        pA = headA

        while pA:

            pB = headB

            while pB:

                if pA == pB:

                    return pA

                else:

                    pB = pB.next

            pA = pA.next

        else:

            return None

 

    '''算法2:哈希查找

    执行用时: 168 ms,  在所有 python3 提交中击败了79.35%的用户

    内存消耗: 28.3 MB, 在所有 python3 提交中击败了90.80%的用户

    '''

    def getIntersectionNode2(self, headA: ListNode, headB: ListNode) -> ListNode:

        lib = set()

        pA = headA

        while pA:

            lib.add(pA)

            pA = pA.next

        pB = headB

        while pB:

            if pB in lib:

                return pB

            else:

                pB = pB.next

        else:

            return None

   

    '''算法3:双指针法

    执行用时: 156 ms,  在所有 python3 提交中击败了95.62%的用户

    内存消耗: 27.9 MB, 在所有 python3 提交中击败了99.80%的用户

    '''

    def getIntersectionNode3(self, headA: ListNode, headB: ListNode) -> ListNode:

        pA, pB = headA, headB

        while pA != pB:

            pA = pA.next if pA else headB

            pB = pB.next if pB else headA

        return pA

   

    '''算法4:双指针法

    执行用时: 160 ms,  在所有 python3 提交中击败了91.69%的用户

    内存消耗: 28 MB, 在所有 python3 提交中击败了99.80%的用户

    '''

    def getIntersectionNode4(self, headA: ListNode, headB: ListNode) -> ListNode:

        if headA is None or headB is None:

            return None

        pA, pB = headA, headB

        for i in range(2):#pA和pB各指向None一次,然后二者刚好对齐

            while pA and pB:

                pA, pB = pA.next, pB.next

            if pA is None:

                pA = headB

            else:

                pB = headA

        while pA != pB: #遍历可能存在共同结点的区域

            pA, pB = pA.next, pB.next

        return pA

 

a = 99

b = 8 if a == 9 else 80

print(b)

a = [2, 4, 3, 5, 8]

b = [5, 6, 4]

c = [1,2,3,4]

p = ha = ListNode(0)

for x in a:

    p.next = ListNode(x)

    p = p.next

p = hb = ListNode(0)

for x in b:

    p.next = ListNode(x)

    p = p.next

p = hc = ListNode(0)

for x in c:

    p.next = ListNode(x)

    p = p.next

p = ha

while p.next is not None:

    p = p.next

p.next = hc.next

p = hb

while p.next is not None:

    p = p.next

p.next = hc.next

 

p = ha.next

while p is not None:

    print(p.val, end=' ')

    p = p.next

print()

p = hb.next

while p is not None:

    print(p.val, end=' ')

    p = p.next

print()

 

x = Solution()

p = x.getIntersectionNode4(ha.next, hb.next)

while p:

    print(p.val, end=' ')

    p = p.next

print()

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!