示例#1
0
        //O(a+b) time, O(1) space
        static LinkListNode getIntersect(LinkListNode n1, LinkListNode n2)
        {
            LinkListNode head1 = n1;
            LinkListNode head2 = n2;
            TailAndSize s1 = getTailandSize(n1);
            TailAndSize s2 = getTailandSize(n2);

            if (s1.Tail == s2.Tail)
            {
                LinkListNode longer = s1.Size > s2.Size ? head1 : head2;
                LinkListNode shorter = s1.Size < s2.Size ? head1 : head2;

                longer = getKthNode(longer, Math.Abs(s1.Size - s2.Size));

                while (longer != shorter) {
                    longer = longer.next;
                    shorter = shorter.next;
                }

                return longer;

            }
            else
                return null;
        }
 public void setPrevious(LinkListNode p)
 {
     prev = p;
     if (p != null && p.next != this)
     {
         p.setNext(this);
     }
 }
示例#3
0
        static LinkListNode getKthNode(LinkListNode node, int k)
        {
            while (k > 0) {
                node = node.next;
                k--;
            }

            return node;
        }
示例#4
0
        static TailAndSize getTailandSize(LinkListNode node)
        {
            int i = 1;
            while(node.next != null){
                ++i;
                node = node.next;
            }

            return new TailAndSize(node, i);
        }
示例#5
0
        static LinkListNode getKthNode(LinkListNode node, int k)
        {
            while (k > 0)
            {
                node = node.next;
                k--;
            }

            return(node);
        }
 public LinkListNode clone()
 {
     LinkListNode next2 = null;
     if (next != null)
     {
         next2 = next.clone();
     }
     LinkListNode head2 = new LinkListNode(data, next2, null);
     return head2;
 }
示例#7
0
        public LinkListNode clone()
        {
            LinkListNode next2 = null;

            if (next != null)
            {
                next2 = next.clone();
            }
            LinkListNode head2 = new LinkListNode(data, next2, null);

            return(head2);
        }
示例#8
0
 public void setNext(LinkListNode n)
 {
     next = n;
     if (this == last)
     {
         last = n;
     }
     if (n != null && n.prev != this)
     {
         n.setPrevious(this);
     }
 }
示例#9
0
        static TailAndSize getTailandSize(LinkListNode node)
        {
            int i = 1;

            while (node.next != null)
            {
                ++i;
                node = node.next;
            }

            return(new TailAndSize(node, i));
        }
示例#10
0
 public void setNext(LinkListNode n)
 {
     next = n;
     if (this == last)
     {
         last = n;
     }
     if (n != null && n.prev != this)
     {
         n.setPrevious(this);
     }
 }
示例#11
0
        //determing if 2 lists intersect, return the intersecting node.
        static void Main(string[] args)
        {
            //0 -> 1 -> 2 -> 3 -> 6 -> 7
            //     5 -> 4 -> 3 -> 6 -> 7

            LinkListNode n1 = new LinkListNode(0);
            n1.next = new LinkListNode(1);
            n1.next.next = new LinkListNode(2);

            LinkListNode n2 = new LinkListNode(5);
            n2.next = new LinkListNode(4);

            LinkListNode intersect = new LinkListNode(3);
            n1.next.next.next = intersect;
            n2.next.next = intersect;

            intersect.next = new LinkListNode(6);
            intersect.next.next = new LinkListNode(7);

            Console.WriteLine(n1.printForward());
            Console.WriteLine(n2.printForward());

            if (getIntersect(n1, n2) != null)
                Console.WriteLine(getIntersect(n1, n2).printForward());
            else
                Console.WriteLine("not intersacted");

            LinkListNode n1notintersact = new LinkListNode(0);
            n1notintersact.next = new LinkListNode(1);
            n1notintersact.next.next = new LinkListNode(2);
            n1notintersact.next.next.next = new LinkListNode(3);
            n1notintersact.next.next.next.next = new LinkListNode(6);
            n1notintersact.next.next.next.next.next = new LinkListNode(7);

            LinkListNode n2notintersact = new LinkListNode(5);
            n2notintersact.next = new LinkListNode(4);
            n2notintersact.next.next = new LinkListNode(3);
            n2notintersact.next.next.next = new LinkListNode(6);
            n2notintersact.next.next.next.next = new LinkListNode(7);

            Console.WriteLine(n1notintersact.printForward());
            Console.WriteLine(n2notintersact.printForward());

            if (getIntersect(n1notintersact, n2notintersact) != null)
                Console.WriteLine(getIntersect(n1notintersact, n2notintersact).printForward());
            else
                Console.WriteLine("not intersacted");
        }
示例#12
0
 public TailAndSize(LinkListNode tail, int size)
 {
     this.Tail = tail;
     this.Size = size;
 }
示例#13
0
 public TailAndSize(LinkListNode tail, int size)
 {
     this.Tail = tail;
     this.Size = size;
 }
示例#14
0
 public LinkListNode(int d, LinkListNode n, LinkListNode p)
 {
     data = d;
     setNext(n);
     setPrevious(p);
 }
示例#15
0
    {//determing if 2 lists intersect, return the intersecting node.
        static void Main(string[] args)
        {
            //0 -> 1 -> 2 -> 3 -> 6 -> 7
            //     5 -> 4 -> 3 -> 6 -> 7

            LinkListNode n1 = new LinkListNode(0);

            n1.next      = new LinkListNode(1);
            n1.next.next = new LinkListNode(2);

            LinkListNode n2 = new LinkListNode(5);

            n2.next = new LinkListNode(4);



            LinkListNode intersect = new LinkListNode(3);

            n1.next.next.next = intersect;
            n2.next.next      = intersect;

            intersect.next      = new LinkListNode(6);
            intersect.next.next = new LinkListNode(7);

            Console.WriteLine(n1.printForward());
            Console.WriteLine(n2.printForward());

            if (getIntersect(n1, n2) != null)
            {
                Console.WriteLine(getIntersect(n1, n2).printForward());
            }
            else
            {
                Console.WriteLine("not intersacted");
            }



            LinkListNode n1notintersact = new LinkListNode(0);

            n1notintersact.next                     = new LinkListNode(1);
            n1notintersact.next.next                = new LinkListNode(2);
            n1notintersact.next.next.next           = new LinkListNode(3);
            n1notintersact.next.next.next.next      = new LinkListNode(6);
            n1notintersact.next.next.next.next.next = new LinkListNode(7);

            LinkListNode n2notintersact = new LinkListNode(5);

            n2notintersact.next                = new LinkListNode(4);
            n2notintersact.next.next           = new LinkListNode(3);
            n2notintersact.next.next.next      = new LinkListNode(6);
            n2notintersact.next.next.next.next = new LinkListNode(7);

            Console.WriteLine(n1notintersact.printForward());
            Console.WriteLine(n2notintersact.printForward());

            if (getIntersect(n1notintersact, n2notintersact) != null)
            {
                Console.WriteLine(getIntersect(n1notintersact, n2notintersact).printForward());
            }
            else
            {
                Console.WriteLine("not intersacted");
            }
        }
示例#16
0
 public LinkListNode(int d, LinkListNode n, LinkListNode p)
 {
     data = d;
     setNext(n);
     setPrevious(p);
 }