ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LeetCode - 21. Merge Two Sorted Lists [Java], [Kotlin]
    Algorithms/- LeetCode 2022. 2. 5. 22:33
     

    Merge Two Sorted Lists - LeetCode

    Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

    leetcode.com

     

    # Java

    정답(Solution)

    /**
     * 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 {
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    
            ListNode root = new ListNode();
            ListNode dummy = root;
    
            while(list1 != null || list2 != null){
    
                ListNode node = new ListNode();
    
                if(list1 == null){
                    node.val = list2.val;
                    list2 = list2.next;
                }else if(list2 == null){
                    node.val = list1.val;
                    list1 = list1.next;
                }else{
                    if(list1.val <= list2.val){
                        node.val = list1.val;
                        list1 = list1.next;
                    }else{
                        node.val = list2.val;
                        list2 = list2.next;
                    }
                }
    
                root.next = node;
                root = root.next;
            }
    
            return dummy.next;
        }
    }

     

    분석

    • 연결 리스트 문제
    • Node에 대해서 기본 지식이 있어야 풀 수 있는 문제

     

    참고할 만한 정답

    /**
     * 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 {
        public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
            if(list1==null) return list2;
            if(list2==null) return list1;
    
          if(list1.val<list2.val)
          {
             list1.next=mergeTwoLists(list1.next,list2);
              return list1;
          }
    
            else
            {
                list2.next=mergeTwoLists(list1,list2.next);
                return list2;
            }
    
        }
    }

     

    비교 분석

    • 재귀를 이용하여 풀었다.
    • 정답들을 비교해 보니 내 풀이는 while문을 돌때마다 new로 ListNode를 생성해서 메모리를 조금 더 사용했다.

     

    # Kotlin

    정답(Solution) - Iteration

    /**
     * Example:
     * var li = ListNode(5)
     * var v = li.`val`
     * Definition for singly-linked list.
     * class ListNode(var `val`: Int) {
     *     var next: ListNode? = null
     * }
     */
    class Solution {
        fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
            
            var l1 = list1
            var l2 = list2
            
            val head = ListNode()
            var tail = head
            
            while(l1 != null && l2 != null){
                if(l1.`val` < l2.`val`){
                    tail.next = l1
                    l1 = l1.next
                }else{
                    tail.next = l2
                    l2 = l2.next
                }
                tail = tail.next
            }
            
            tail.next = l1 ?: l2
            
            return head.next
        }
    }

    분석

    • Java와는 다르게 val는 불변 변수이기 때문에 input을 바로 사용할 수 없고 var로 선언한 변수에 담아서 사용해야 한다.

     

    정답(Solution) - Recursion

    /**
     * Example:
     * var li = ListNode(5)
     * var v = li.`val`
     * Definition for singly-linked list.
     * class ListNode(var `val`: Int) {
     *     var next: ListNode? = null
     * }
     */
    class Solution {
        fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
            when{
                list1 == null -> return list2
                list2 == null -> return list1
                list1.`val` < list2.`val` -> {
                    list1.next = mergeTwoLists(list1.next, list2)
                    return list1
                }
                else -> {
                    list2.next = mergeTwoLists(list1, list2.next)
                    return list2
                }
            }
        }
    }
    반응형

    댓글

Designed by Tistory.