• 找出链表的第一个公共节点


    62.找出链表的第一个公共结点。
    题目:两个单向链表,找出它们的第一个公共结点

    思路:

    1.暴力法 但时间复杂度太高 o(n*m)

    2.如果两个链表有公共节点,则从该公共节点起,后面的节点均为公共的,即这两个链表在第一个公共节点交叉,然后形成一个Y字型,因为两个链表长度不一定一样,所以可以先求得他们的长度n与m,然后得到长度差:Math.abs(n-m),然后先对较长链表先行遍历n-m个节点,从第n-m+1个节点开始对这两个链表遍历,然后找出第一个相同的即可  (网上抄别人的)

    3. 位图法 对两个链表分别建立bitmap,然后对这两个bitmap进行与运算即可,则得到的结果中最左边的那个1即代表第一个相同元素,然后对该值每次右移一位,直到等于1为止,右移的次数即为第一个公共元素,时间复杂度为o(n+m)

     1 package com.rui.microsoft;
     2 
     3 //62.找出链表的第一个公共结点。
     4 //题目:两个单向链表,找出它们的第一个公共结点
     5 public class Test62_FindCommonNodeFromLinkedLists {
     6 
     7     public static void main(String[] args) {
     8         Node node1 = new Node(1);
     9         Node node2 = new Node(2);
    10         Node node3 = new Node(3);
    11         node1.next = node2;
    12         node2.next = node3;
    13         
    14         Node node4 = new Node(4);
    15         Node node5 = new Node(5);
    16         Node nodeS = new Node(2);
    17         Node node6 = new Node(1);
    18         node4.next = node5;
    19         node5.next = nodeS;
    20         nodeS.next = node6;
    21         
    22         Test62_FindCommonNodeFromLinkedLists app = new Test62_FindCommonNodeFromLinkedLists();
    23         app.find(node1, node4);
    24     }
    25     
    26     //位运算法
    27     //时间复杂度o(n+m) => 遍历链表构造bitmap
    28     void find(Node headX, Node headY){
    29         Node x = headX;
    30         Node y = headY;
    31         
    32         int bitX = 0;
    33         int bitY = 0;
    34         
    35         while(null != x){
    36             bitX |= 1 << x.value;
    37             x = x.next;
    38         }
    39         
    40         while(null != y){
    41             bitY |= 1 << y.value;
    42             y = y.next;
    43         }
    44         
    45         System.out.println(Integer.toBinaryString(bitX));
    46         System.out.println(Integer.toBinaryString(bitY));
    47         
    48         int inter = bitX & bitY;
    49         String interStr = Integer.toBinaryString(inter);
    50         System.out.println(interStr);
    51         
    52         int radix = 0;
    53         while(inter > 1){
    54             inter >>= 1;
    55             radix++;
    56         }
    57         System.out.println(radix);
    58     }
    59     
    60     static class Node {
    61         int value;
    62         Node next;
    63         public Node(int v){
    64             this.value = v;
    65         }
    66     }
    67 }
  • 相关阅读:
    250 浅拷贝Object.assign(target, ...sources),深拷贝
    249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据
    248 闭包:概念,作用,案例,思考题案例,chrome 中调试闭包
    247 高阶函数 之 函数可以作为参数传递
    246 JavaScript严格模式
    245 改变函数内部 this 指向:call,apply,bind,call、apply、bind 三者的异同
    244 函数内部的this指向:6种
    243 函数:函数的3种定义方式,函数的6种调用方式
    242 Object.defineProperty
    241 获取对象的属性名:Object.keys(对象)
  • 原文地址:https://www.cnblogs.com/aalex/p/5019932.html
Copyright © 2020-2023  润新知