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

    思路:1. 记录两个list的长度,并检测最后一个元素是否相同。如果不同,表明No intersection。 2. 计算list的长度差offset,让长的list的指针先移动offset,然后两个list的指针一起移动,第一个相同的element就是所求node

    2.第二种方法,也很diao! 代码十分简洁

    链接 https://leetcode.com/discuss/17278/accepted-shortest-explaining-algorithm-comments-improvements

    3.第二种是先计算listB中value的总和,再将listA中的所有value增加m,再次计算listB中value总和,如果相同no intersection,不同就有!方法仅仅局限于integer

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(!headA || !headB) return NULL;
            if(headA==headB) return headA;
            ListNode *pa=headA;
            ListNode *pb=headB;
            int la=1;
            int lb=1;
            while(pa && pa->next) {pa=pa->next;la++;}
            while(pb && pb->next) {pb=pb->next;lb++;}
            if(pa!=pb) return NULL; 
            int offset = abs(la-lb);
            pa=headA;
            pb=headB;
            while(offset>0){
                if(la>lb) pa=pa->next;
                else pb=pb->next;
                offset--;
            }
            while(pa && pb){
                if(pa==pb) return pa;
                pa=pa->next;
                pb=pb->next;
            }
        }
    };
  • 相关阅读:
    ruby之gem update --system 失败
    免费的视频资源
    java的数据类型
    函数parseQuery用于解析url查询参数
    使用闭包的方式实现一个累加函数 addNum
    正则表达式之捕获重用
    JavaScript正则表达式练习
    JavaScript的数组和字符串应用
    Sublime Text3.0的安装
    Oracle的集合运算符
  • 原文地址:https://www.cnblogs.com/renrenbinbin/p/4341891.html
Copyright © 2011-2022 走看看