[LeetCode] 61. Rotate List

Chobby·2024년 9월 6일
1

LeetCode

목록 보기
97/194

미리 전체 ListNode를 순회하여 길이를 파악한 후, 꼬리가 될 지점의 이전 지점을 기점으로 k만큼 잘라 이어붙여 해결한다.

k만큼 실제로 이어붙일 경우 시간 초과가 발생하므로 반드시 kListNode의 길이로 나눈 나머지 값으로 사용해야함

😎풀이

function rotateRight(head: ListNode | null, k: number): ListNode | null {
    if (!head || !head.next) return head;

    // 리스트의 길이를 계산하고 마지막 노드를 찾음
    let oldTail = head;
    let length = 1;
    while (oldTail.next) {
        oldTail = oldTail.next;
        length++;
    }

    // k를 리스트 길이로 나눈 나머지를 구함 (불필요한 회전 제거)
    k = k % length;
    
    // k가 0이면 회전할 필요가 없음
    if (k === 0) return head;

    // 새로운 tail을 찾음 (회전 후 마지막 노드가 될 노드)
    let newTail = head;
    for (let i = 0; i < length - k - 1; i++) {
        newTail = newTail.next!;
    }

    // 새로운 head를 설정하고 리스트를 재구성
    let newHead = newTail.next;
    newTail.next = null;
    oldTail.next = head;

    return newHead;
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글