Algorithms/- LeetCode

LeetCode - 21. Merge Two Sorted Lists [Java], [Kotlin]

자굿 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
            }
        }
    }
}
반응형