zoukankan      html  css  js  c++  java
  • LeetCode-160. Intersection of Two Linked Lists

    160. Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins.

    For example, the following two linked lists:

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    

    begin to intersect at node c1.

    Notes:

    If the two linked lists have no intersection at all, return null.

    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
    • Your code should preferably run in O(n) time and use only O(1) memory.

    Solution

    # 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
            """
            # A length = a + c, B length = b + c, after switching pointer, pointer A will move another b + c steps, pointer B will move a + c more steps, 
            # since a + c + b + c = b + c + a + c, it does not matter what value c is. 
            # Pointer A and B must meet after a + c + b (b + c + a) steps. If c == 0, they meet at NULL.
            if not headA or not headB:
                return None
            pA = headA
            pB = headB
            # if the two lists have no intersection at all,you should stop after you've already checked L1+L2, 
            # so we need a flag jumpToNext to ensure we only traverse L1 + L2 once.
            jumpToNext = False
            while pA and pB:
                if pA == pB:
                    return pA
                pA, pB = pA.next, pB.next
                if not pA and not jumpToNext:
                    pA = headB
                    jumpToNext = True
                if not pB:
                    pB = headA
            return None
    

    其他方法:

    1. 先翻转两个链表,找到汇合节点再将两个链表翻转回来。

    2. 先得到两个链表的长度,然后从相同长度的地方开始判断。但是时间复杂度高了。

  • 相关阅读:
    14-快速排序
    linux上挂在windows的共享文件系统,大小写不敏感
    【mount】linux挂共享盘
    监控windows服务或者进程
    自定义时间间隔
    示例
    filebeat
    kafka
    文档碎片
    简单DOM操作
  • 原文地址:https://www.cnblogs.com/binwone/p/6246581.html
Copyright © 2011-2022 走看看