21. Merge Two Sorted Lists

 

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

 

21. Слияние двух отсортированных списков

 

Произведите слияние двух отсортированных списков и верните новый список. Новый список должен образоваться в результате сплетения вершин двух списков.

 

// C++

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

  ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

       

  }

};

 

// Java

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) { val = x; }

 * }

 */

public class Solution {

  public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

       

  }

}

 

РЕШЕНИЕ

структуры данных – список

 

Анализ алгоритма

Создадим результирующий список res, который изначально содержит одну фиктивную вершину (присвоим например ей значение 0). Далее продолжаем пока один из списков не станет пустым:

·         Если один из списков пустой, то прикрепим в хвост результата второй список. Выходим из цикла.

·         Сравним головы списков. Меньшую их них добавляем в голову res, а в самом списке удаляем голову.

По завершению цикла возвращаем res -> next, таким образом удаляя из головы фиктивную вершину.

 

Реализация алгоритма

 

struct ListNode

{

  int val;

  ListNode *next;

  ListNode(int x) : val(x), next(NULL) {}

};

 

class Solution

{

public:

  ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)

  {

    ListNode* res = new ListNode(0);

    ListNode* current = res;

    while (true)

    {

      if (l1 == NULL)

      {

        current->next = l2;

        break;

      }

      if (l2 == NULL)

      {

        current->next = l1;

        break;

      }

      if (l1->val < l2->val)

      {

        current->next = l1;

        l1 = l1->next;

      }

      else

      {

        current->next = l2;

        l2 = l2->next;

      }

      current = current->next;

    }

    return res->next;

  }

};

 

Java реализация

 

class ListNode

{

  int val;

  ListNode next;

  ListNode(int x) { val = x; }

}

 

class Solution

{

  public ListNode mergeTwoLists(ListNode l1, ListNode l2)

  {

    ListNode res = new ListNode(0);

    ListNode current = res;

    while (true)

    {

      if (l1 == null)

      {

        current.next = l2;

        break;

      }

      if (l2 == null)

      {

        current.next = l1;

        break;

      }

      if (l1.val < l2.val)

      {

        current.next = l1;

        l1 = l1.next;

      }

      else

      {

        current.next = l2;

        l2 = l2.next;

      }

      current = current.next;

    }

    return res.next;

  }

}