diff --git a/merge-two-sorted-lists/river20s.java b/merge-two-sorted-lists/river20s.java new file mode 100644 index 000000000..09f07c7b1 --- /dev/null +++ b/merge-two-sorted-lists/river20s.java @@ -0,0 +1,93 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + /* + * [풀이] + * 1) 두 리스트가 이미 정렬된 상태 → 맨 앞에서부터 둘 중 더 작은 노드를 결과 리스트 rs에 이어 붙인다. + * 2) 하나의 리스트가 끝날 때까지 반복한다. → 남은 리스트의 노드는 그대로 rs에 붙인다. + * 3) rs 헤드 노드의 next부터 반환한다. + * [T.C] + * 각 노드를 한 번씩 비교 → 연결(또는 연결만)하므로, + * T.C = O(n+m) (n = list1의 길이, m = list2의 길이) + * [S.C] + * list1과 list2의 노드를 다시 연결하는 것이므로 추가적인 공간은 거의 필요하지 않으므로(rs의 head 정도?), + * S.C = O(1) + */ + + public ListNode mergeTwoLists(ListNode list1, ListNode list2) { + ListNode rs = new ListNode(0); + ListNode rsNext = rs; + // step 1 + while (list1 != null && list2 != null) { + if (list1.val <= list2.val) { + rsNext.next = list1; + list1 = list1.next; + } + else { + rsNext.next = list2; + list2 = list2.next; + } + rsNext = rsNext.next; + } + // step 2 + if (list1 != null) rsNext.next = list1; + if (list2 != null) rsNext.next = list2; + // step3 + return rs.next; + } +} +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ +class Solution { + /* + * [풀이] + * 1) 두 리스트가 이미 정렬된 상태 → 맨 앞에서부터 둘 중 더 작은 노드를 결과 리스트 rs에 이어 붙인다. + * 2) 하나의 리스트가 끝날 때까지 반복한다. → 남은 리스트의 노드는 그대로 rs에 붙인다. + * 3) rs 헤드 노드의 next부터 반환한다. + * [T.C] + * 각 노드를 한 번씩 비교 → 연결(또는 연결만)하므로, + * T.C = O(n+m) (n = list1의 길이, m = list2의 길이) + * [S.C] + * list1과 list2의 노드를 다시 연결하는 것이므로 추가적인 공간은 거의 필요하지 않으므로(rs의 head 정도?), + * S.C = O(1) + */ + + public ListNode mergeTwoLists(ListNode list1, ListNode list2) { + ListNode rs = new ListNode(0); + ListNode rsNext = rs; + // step 1 + while (list1 != null && list2 != null) { + if (list1.val <= list2.val) { + rsNext.next = list1; + list1 = list1.next; + } + else { + rsNext.next = list2; + list2 = list2.next; + } + rsNext = rsNext.next; + } + // step 2 + if (list1 != null) rsNext.next = list1; + if (list2 != null) rsNext.next = list2; + // step3 + return rs.next; + } +} +