๋ฌธ์ ํ์
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ head
๊ฐ ์ฃผ์ด์ง๋ค.
์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ ๋ฐํํด์ผํ๋ค.
ํ์ด
1๏ธโฃ ๋ฐฐ์ด๊ณผ mergeSort
๐ก ๋ ์ค๋ฅธ Idea
O(NlogN) ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ ค๋ดค๋ค.
ํด๋น ์๊ฐ ๋ณต์ก๋๋ก ์ ๋ ฌํ ์ ์๋ Merge Sort ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ๋ค.
class Solution {
public ListNode sortList(ListNode head) {
int cnt = getCount(head);
System.out.println(cnt);
int[] arr = new int[cnt];
ListNode dummyHead = new ListNode(0, head);
ListNode node = head;
for (int i = 0; i < cnt; i++) {
arr[i] = node.val;
node = node.next;
}
mergeSort(arr, 0, cnt);
for (int i = 0; i < cnt; i++) {
head.val = arr[i];
head = head.next;
}
return dummyHead.next;
}
private int getCount(ListNode head) {
int cnt = 0;
while (head != null) {
head = head.next;
cnt++;
}
return cnt;
}
private void mergeSort(int[] arr, int left, int right) {
if (right - left <= 1) {
return;
}
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid, right);
merge(arr, left, mid, right);
}
private void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left];
int idx = 0, l = left, r = mid;
while (l < mid && r < right) {
if (arr[l] > arr[r]) {
temp[idx++] = arr[r++];
} else {
temp[idx++] = arr[l++];
}
}
while (l < mid) {
temp[idx++] = arr[l++];
}
while (r < right) {
temp[idx++] = arr[r++];
}
for (int i = left; i < right; i++) {
arr[i] = temp[i - left];
}
}
}
๋ฐฐ์ด mergeSort๋ฅผ ๊ตฌํํ ๊ฒฝํ์ด ์์ด, Node ์ ๊ฐ์ ๋ฐฐ์ด์ ์ฎ๊ฒจ์ mergeSort ๋ฅผ ํ๊ณ ๊ฐ์ ๊ฐฑ์ ์์ผ์ฃผ๋ ๋ฐฉ์์ผ๋ก ์งํํ์๋ค.
๊ฒฐ๊ณผ
์ด ๋ฐฉ์์ ๋จ์ ์ ๋ฐฐ์ด์ ์ ์ธํจ์ผ๋ก์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค๋ ๊ฒ์ด๋ค.
๐ ํ๊ณ
์ถ๊ฐ์ ์ธ ๋ฐฐ์ด ์์ฑ์์ด ๋ ธ๋๋ก๋ง ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผ ์ค์ด๋ค..
ํผ์์ 3์๊ฐ ์ ๋๋ ๊ตฌํํด๋ณด๋ ค๊ณ ํ ๊ฒ ๊ฐ์๋ฐ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ๋ง์์ ์ฝ๊ฒ ํด๊ฒฐ๋์ง ์๋๋ค.
ํผ์ ํด๊ฒฐํด๋ณด๊ณ ๋ด์ฉ์ ์ถ๊ฐํด๋ด์ผ๊ฒ ๋ค.