• 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

  • 相关阅读:
    KLSudoku的数独题目生成方法和难度控制说明
    对XChain和ForcingChain的实现解说
    开源数独游戏软件KLSudoku发布第一个Release版本
    每个 Vim 用户都应该阅读的文章
    自己常用的几个gvim的vimrc设置
    KLSudoku数独游戏软件1.1预览版发布
    KLSudoku数独游戏软件1.1正式版发布
    字符串
    .NET面试大全
    IIS是如何处理ASP.NET请求的
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4800598.html
Copyright © 2020-2023  润新知