개발 공부/알고리즘 문제 풀이

[LeetCode] 92. Reverse Linked List II

종범2 2021. 6. 24. 01:16

문제

92. Reverse Linked List II

https://leetcode.com/problems/reverse-linked-list-ii/

 

Reverse Linked List II - 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

언어

자바스크립트(JavaScript)

 

접근 방법

  1. 먼저 루프를 돌면서 reverse 하기 전 숫자 배열과 reverse 하는 동안의 숫자 배열과 reverse가 끝난 후의 숫자 배열을 구한다.
  2. 각 배열을 이용하여 새로운 ListNode를 만든다.

코드

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 */
var reverseBetween = function(head, left, right) {
    let cnt = 1;
    let node = head;
    let beforeReverseArr = [];
    let reverseArr = [];
    let afterReverseArr = [];
    while(node){
        // cnt < left 구간 진입 전이면 beforeReverseArr에 숫자 저장
        if(cnt < left){
            beforeReverseArr.push(node.val);
        }
        // left <= cnt <= right면 reverseArr에 숫자 저장
        if(cnt >= left && cnt <=right){
            reverseArr.push(node.val);
        }
        // cnt > right면 afterReverseArr에 숫자 저장.
        if(cnt > right){
            afterReverseArr.push(node.val);
        }
        node = node.next;
        cnt ++;
    }
    // 배열을 바탕으로 ListNode 생성
    let result;
    let prevListNode = null;
    while(afterReverseArr.length){
        result = new ListNode(afterReverseArr.pop(), prevListNode);
        prevListNode = result
    }
    while(reverseArr.length){
        result = new ListNode(reverseArr.shift(), prevListNode);
        prevListNode = result
    }
    while(beforeReverseArr.length){
        result = new ListNode(beforeReverseArr.pop(), prevListNode);
        prevListNode = result
    }
    return result
};

결과

Runtime: 68 ms, faster than 97.22% of JavaScript online submissions for Reverse Linked List II.

Memory Usage: 40.1 MB, less than 5.56% of JavaScript online submissions for Reverse Linked List II.

복기

  1. 새롭게 ListNode를 정의하는 코드를 처음 짜봐서 많이 헤매었다. ListNode를 정의할 때는 반대 순서로 먼저 정의해야 한다.