zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    微信小程序之界面交互反馈
    微信小程序引入腾讯地图API方法
    微信小程序动态修改页面标题setNavigationBarTitle
    JavaScript中||和&&的运算
    微信小程序 使用include导入wxml文件注意的问题
    idea中文乱码及maven项目配置问题
    Linux常用命令大全
    2018年深圳,武汉房价走势分析
    redis安装,windows,linux版本并部署服务
    dubbo基础学习总结
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4800598.html
Copyright © 2011-2022 走看看