Merge K Sorted Lists
포스트
취소

Merge K Sorted Lists

23. Merge K Sorted Lists

문제 설명

k 개의 연결 리스트로 이루어진 배열 lists가 주어지며, 각 연결 리스트는 오름차순으로 정렬되어있다.

모든 연결 리스트를 하나의 정렬된 연결 리스트로 병합하고, 반환하라.

해결 방법

해당 풀이는 아주 야매 풀이 방식이다. 제대로 된 풀이를 하려면 힙을 구현하거나, 리스트를 하나로 병합할 수 있는 재귀 풀이 방식을 사용하는 것이다.

풀이 방식은 너무나도 쉽다. k개의 리스트들을 하나의 배열로 병합한 뒤 정렬시킨다. 그 후 하나의 리스트로 만들면 끝.
원래는 재귀 풀이 방식을 사용했는데 최적화를 하지 않은 재귀는 너무나도 느렸다(가장 빠른 풀이의 3배 정도). 그래서 가장 빠른 풀이를 봤는데 리스트 -> 배열 -> 리스트 방식을 사용하는 것을 보고 한 번 해보고 싶어서 이 방식으로 풀었다.

풀이 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { ListNode } from '../utils';

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
  if (!lists) return null;

  const tmpArr = [];
  const head = new ListNode();
  let current = head;

  for (let i = 0; i < lists.length; i++) {
    while (lists[i]) {
      tmpArr.push(lists[i].val);
      lists[i] = lists[i].next;
    }
  }

  const sortedTmpArr = tmpArr.sort((a, b) => a - b);

  sortedTmpArr.forEach((value) => {
    current.next = new ListNode(value);
    current = current.next;
  });
  return head.next;
}

테스트 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
describe(' description', () => {
  test('example test', () => {
    const input = [
      convertArrayToList([1, 4, 5]),
      convertArrayToList([1, 3, 4]),
      convertArrayToList([2, 6]),
    ];
    const output = mergeKLists(input);
    const expected = convertArrayToList([1, 1, 2, 3, 4, 4, 5, 6]);
    expect(output).toEqual(expected);
  });
  test('test null lists', () => {
    const input = [];
    const output = mergeKLists(input);
    const expected = convertArrayToList([]);
    expect(output).toEqual(expected);
  });

  test('test empty list', () => {
    const input = [convertArrayToList([])];
    const output = mergeKLists(input);
    const expected = convertArrayToList([]);
    expect(output).toEqual(expected);
  });
});

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.