public ListNode MergeKLists(ListNode[] lists)
 {
     switch(lists.Length)
     {
         case 0:
             return null;
         case 1:
             return lists.First();
         default:
             var newLists = new ListNode[(lists.Length + 1) / 2];
             for (var index = 0; index < lists.Length; index += 2)
             {
                 newLists[index / 2] = index == lists.Length - 1
                     ? lists[index]
                     : this.Merge2Lists(
                         lists[index]
                         , lists[index + 1]);
             }
             return this.MergeKLists(newLists);
     }
 }