• leetcode 160.相交链表


    编写一个程序,找到两个单链表相交的起始节点。

    如下面的两个链表:

    在节点 c1 开始相交。

    刚开始想到的是暴力解法,双层循环遍历两个链表,然后对比是否有相同节点,有的话就直接返回,结果翻车了

    var getIntersectionNode = function(headA, headB) {
            var startB = headB
            if(!headA || !headB){
                return null
            }
            while(headA){
                console.log('A'+headA.val);
                while (headB) {
                    console.log('B'+headB.val);
                    if(headB.val == headA.val) {
                        return headB.val
                    }
                    headB = headB.next
                }
                if(headA.val == headB.val){
                    return headA.val
                }
                headB = startB
                headA = headA.next
            }
            return null
        };

         

     判断到4就结束 了,好吧,行不通。

    第二种方法:

    var getIntersectionNode = function(headA, headB) {
            if (!headA || !headB) {
                return null;
            }
            let a = headA,
                b = headB;
            // 相交则返回当前节点,否则返回 null
            // 当 a、b 还没相交时:
            // 1. 如果 a 为 null,将 headB 赋值给 a;
            // 2. 如果 b 为 null,将 headA 赋值给 b;
            while (a !== b) {
                a = a ? a.next : headB;
                b = b ? b.next : headA;
                console.log('a:'+JSON.stringify(a))
                console.log('b:' + JSON.stringify(b));
            }
            return a;
        };

    因为两个链表的长度不一样,但是两个链表分别加上对方的链表长度就一样了,如下:

     这样的话,如果链表有相交部分,那么在遍历的时候一定会相等的,等到链表相等的时候就退出循环返回相等部分的值。可能不理解怎么就相等了,原因是链表next指针在向后移动的时候,前面没有指针指向的部分会被删除掉,这样就只比较剩下的部分,直到两个相等了退出循环。若是不等,也会输出null,不会造成死循环

    执行步骤如下:

        a:{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}
        b:{"val":0,"next":{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}}
        a:{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}
        b:{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}
        a:{"val":4,"next":{"val":5,"next":null}}
        b:{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}
        a:{"val":5,"next":null}
        b:{"val":4,"next":{"val":5,"next":null}}
        a:null
        b:{"val":5,"next":null}
        a:{"val":5,"next":{"val":0,"next":{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}}}
        b:null
        a:{"val":0,"next":{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}}
        b:{"val":4,"next":{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}}
        a:{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}
        b:{"val":1,"next":{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}}
        a:{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}
        b:{"val":8,"next":{"val":4,"next":{"val":5,"next":null}}}
    不积跬步无以至千里
  • 相关阅读:
    InfoPath 发布表单到SharePoint库报错
    在log4net中控制nhibernate输出
    微信扫一扫(wx.scanQRCode)功能新手可能遇到的问题
    3.Zookeeper的安装和配置(集群模式)
    1.配置HDFS HA (高可用)
    2.Zookeeper工作原理(详细)
    1.Zookeeper 定义与工作原理
    js 获取元素的几种方法
    弹出层居中
    XUACompatible
  • 原文地址:https://www.cnblogs.com/lyt0207/p/12364016.html
Copyright © 2020-2023  润新知