• Leetcode 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.

    解题思路:

    一定要正确理解题意。Intersection 就是两个链表最后有完全相同的地方。所以要从相同长度开始计算。开始我没有正确理解题意,怎么也想不出来。后来看了答案才明白,简单明了。

    1. 得到2个链条的长度。

    2. 将长的链条向前移动差值(len1 - len2)

    3. 两个指针一起前进,遇到相同的即是交点,如果没找到,返回null.

    相当直观的解法。空间复杂度O(1), 时间复杂度O(m+n)

    First calculate the length of two lists and find the difference. Then start from the longer list at the diff offset, iterate though 2 lists and find the node.


    Java code:

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            //First calculate the length of two lists and find the difference. 
            //Then start from the longer list at the diff offset, iterate though 2 lists and find the node.
            int len1 = 0;
            int len2 = 0;
            ListNode p1 = headA;
            ListNode p2 = headB;
            if(p1 == null || p2 == null) {
                return null;
            }
            
            while(p1!= null) {
                len1++;
                p1 = p1.next;
            }
             while(p2!= null) {
                len2++;
                p2 = p2.next;
            }
            
            int diff = 0;
            p1 = headA;
            p2 = headB;
            
            if(len1 > len2) {
                diff = len1 -len2;
                int i = 0;
                while(i< diff) {
                    p1 = p1.next;
                    i++;
                }
            }else {
                diff = len2- len1;
                int i = 0;
                while(i< diff) {
                    p2 = p2.next;
                    i++;
                }
            }
            
            while(p1 != null && p2 != null) {
                if(p1.val == p2.val) {
                    return p1;
                }
                p1 = p1.next;
                p2 = p2.next;
            }
            return null;
        }

    Reference:

    1. http://www.programcreek.com/2014/02/leetcode-intersection-of-two-linked-lists-java/

    2. http://yucoding.blogspot.com/2014/12/leetcode-question-intersection-of-two.html

  • 相关阅读:
    一行Haskell语句打印勾股数
    给孩子增加学习生物的兴趣,买了个显微镜
    实现求n个随机数和为sum的haskell程序
    用haskell实现的八皇后程序
    桥牌笔记:第一墩决定成败
    读书笔记:父母离去前要做的55件事
    LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
    LINQ to SQL系列四 使用inner join,outer join
    Asp.Net 4.0 新特性 系列 之一 从页面标记<%%>说起
    使用javascript自动标记来自搜索结果页的关键字
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4800598.html
Copyright © 2020-2023  润新知