/* Генерира примерно множество */
        private static Node Generate(int n)
        {
            var rand = new Random();
            Node p = Node.Z;
            for (int i = 0; i < n; i++)
            {
                var q = new Node { Value = rand.Next() % ((2 * n) + 1), Next = p };
                p = q;
            }

            return p;
        }
        private static Node MergeSort(Node c)
        {
            /* Ако списъкът съдържа само един елемент: не се прави нищо */
            if (c.Next == Node.Z)
            {
                return c;
            }

            Node a = c;
            Node b = c.Next.Next.Next;
            /* Списъкът се разделя на две части */
            while (b != Node.Z)
            {
                b = b.Next.Next;
                c = c.Next;
            }

            b = c.Next;
            c.Next = Node.Z;

            /* Сортиране поотделно на двете части, последвано от сливане */
            return Merge(MergeSort(a), MergeSort(b));
        }
 private static Node Merge(Node a, Node b)
 {
     /* Предполага се, че и двата списъка съдържат поне по един елемент */
     Node tail = Node.Z;
     do
     {
         if (a.Value < b.Value)
         {
             tail.Next = a;
             tail = a;
             a = a.Next;
         }
         else
         {
             tail.Next = b;
             tail = b;
             b = b.Next;
         }
     }
     while (tail != Node.Z);
     tail = Node.Z.Next;
     Node.Z.Next = Node.Z;
     return tail;
 }
 /* Извежда списъка на екрана */
 private static void PrintList(Node p)
 {
     for (; p != Node.Z; p = p.Next)
     {
         Console.Write("{0,4}", p.Value);
     }
 }