์ฝ๋
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
// ์์ ๋
ธ๋๊ฐ ๊ฐ์ด ๋ ํฌ๋ค๋ฉด ์ค์ ์งํ
if (l1.val > l2.val) {
ListNode temp = l1;
l1 = l2;
l2 = temp;
}
// ์์ ๋
ธ๋์ ๋ค์ ๊ฒฐ๊ณผ๋ ์ฌ๊ท๋ก ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ก ์ง์
l1.next = mergeTwoLists(l1.next, l2);
// l1 ์ชฝ์ผ๋ก ์์ ๋
ธ๋๋ฅผ ์ค์ํ๋ฏ๋ก l1 ๋ฆฌํด
return l1;
}
public ListNode sortList(ListNode head) {
// null์ธ ๋
ธ๋๊น์ง ๋ถํ ๋๋ฉด ์๋ฌด๋ฐ ์ฒ๋ฆฌ ์์ด ๋ฆฌํด
if (head == null || head.next == null) return head;
// ๋ฌ๋ ๊ธฐ๋ฒ ํ์ฉ
ListNode half = null, slow = head, fast = head;
while (fast != null && fast.next != null) {
half = slow;
slow = slow.next;
fast = fast.next.next;
}
// head๋ฅผ ์์์ผ๋ก ํ๋ ๋
ธ๋์ slow๋ฅผ ์์์ผ๋ก ํ๋ ๋
ธ๋์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋๋๋ค.
half.next = null;
// ๋ถํ (divide) ์ฌ๊ท ํธ์ถ. ๊ณ์ ๋ถํ ํด์ ๋ ์ด์ ๋ถํ ๋ชปํ๋ ๋จ์๊น์ง
ListNode l1 = sortList(head);
ListNode l2 = sortList(slow);
// ์ ๋ณต(conquer)์ ์์, ๊ฒฐ๊ณผ ๋ฆฌํด
return mergeTwoLists(l1, l2);
}
}
Java
๋ณต์ฌ
๋ฌ๋ ๊ธฐ๋ฒ
ListNode half = null, slow = head, fast = head;
while (fast != null && fast.next != null) {
half = slow;
slow = slow.next;
fast = fast.next.next;
}
Java
๋ณต์ฌ
half, slow, fast 3๊ฐ์ ๋ณ์๋ฅผ ๋ง๋ค์ด๋๊ณ slow๋ ํ ์นธ์ฉ, fast๋ ๋ ์นธ์ฉ ์์ผ๋ก ์ด๋ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด fast๊ฐ ๋งจ ๋์ ๋๋ฌํ์ ๋, slow๋ ์ค์์ ๋์ฐฉํด ์์ ๊ฒ์ด๋ค. ๋ํ half๋ slow์ ๋ฐ๋ก ์ง์ ๋
ธ๋ ๊ฐ์ด ๋๋ค.
half.next = null;
Java
๋ณต์ฌ
๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ์ด half.next๋ฅผ null๋ก ์ฒ๋ฆฌํ๋ฉด ์๋ ์์ ๋
ธ๋์๋ head์ head๋ฅผ ์ด์ด๋ฐ์ ์งํํ๋ slow๋ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๊ฐ ์์ ํ ๋์ด์ง๊ฒ ๋๋ค.
ListNode l1 = sortList(head);
ListNode l2 = sortList(slow);
Java
๋ณต์ฌ
์ดํ์๋ ์ฌ๊ท ํธ์ถ์ ์งํํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฒ์์๋ 2๊ฐ๋ก ์ชผ๊ฐ์ง์ง๋ง, ์ดํ์ ๊ณ์ํด์ ์ชผ๊ฐ์ง๊ธฐ ๋๋ฌธ์(๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ๋จ์๊น์ง) ๊ฒฐ๊ตญ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋จ์ผ ์์ดํ
์ผ๋ก ๋ชจ๋ ์ชผ๊ฐ์ง๊ฒ ๋๋ค. ์ดํ, mergeSort ๊ณผ์ ์์ ๋ณํฉ๊ณผ ๋์์ ์ ๋ ฌ์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
๋ฌธ์ ํด๊ฒฐ ์์ด๋์ด
๋ฌ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๋ณํฉ ์ ๋ ฌ๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์!