Today I Learned

최지웅·2024년 3월 23일
0

Today I Learned

목록 보기
124/238

오늘 할일
1. 영상처리 코드 결과하면 첨부하여 재제출
2. LeetCode
3. DevOps공부 계획 수립 및 세모봉 검토
4. 주유할인카드 발급
5. 토익?

오늘 한일
1. LeetCode

    1. Odd Even Linked List에서 마지막 리스트 원소가 삭제 대상인 경우, 제대로 삭제되지 않는 오류를 발견했었다. 디버깅을 통해 해당 부분엥서 원소를 삭제하지 않고 작업을 종료하는 것을 확인, 수정하였다.

      테스트 케이스 63번까지 통과하였다. 값이 같은 경우 별다른 처리 없이 넘어가게끔 예외처리를 해주자. 하지만 디버깅 과정에서 값이 같은 경우가 문제가 아니라 0번째 1번째의 경우 head2의 초기화를 위해 별도로 코드를 분기해두었는데, 그 과정에서 리스트가 끝나버려 head1와 head2가 concat되지 않아 원소가 하나만 리턴됐던 것이었다. 해당 부분을 수정해주었다.
/**
 * 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 oddEvenList(ListNode head) {
        /*
            시간복잡도 O(n), 공간복잡도 O(1)로 홀수번째 node를 뒤로 link
         */
        //1. 예외처리(head가 비어있거나 하나일 경우)
        if (head == null) {
            return null;
        } else if (head.next == null) {
            return head;
        }

        //2. 전체 size 계산
        int size = 1;
        for (ListNode i = head; i.next != null; i = i.next) {
            size++;
        }

        ListNode head2 = null, iter2 = null, iter = head, prev = head;
        for (int i = 0; i < size; i++) {
            if (i == 5)
                System.out.println();
            if (i == 0) {
                iter = iter.next;
            } else if (i == 1) {
                if(iter.next!=null) {
                    head2 = new ListNode(iter.val);
                    iter2 = head2;
                    iter = iter.next;
                    prev.next = iter;
                } else{
                    break;
                }
            } else if (i == size - 1) {//merge
                if (i % 2 == 1) {
                    iter2.next = new ListNode(iter.val);
                    iter2=iter2.next;
                    prev.next=head2;
                } else {
                    iter.next = head2;
                }
            } else if (i % 2 == 0) {
                prev = iter;
                iter = iter.next;
            } else if (i % 2 == 1) {
                iter2.next = new ListNode(iter.val);
                iter2 = iter2.next;
                iter = iter.next;
                prev.next = iter;
            }//공통코드는 없다.
        }//endfor

        return head;
    }
}


많은 사람들이 쉽게 푼 코드는 무엇일까 하고 확인해보니

public class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head==null || head.next==null || head.next.next==null){
            return head;
        }
        ListNode oddHead = head;
        ListNode evenHead = head.next;
        ListNode odd = oddHead;
        ListNode even = evenHead;
        while (even!=null && even.next!=null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;

        }
         odd.next = evenHead;
         return head;
    }
}

로 굉장히 간단했다. 순회하는 iter을 두개 만들어 홀수는 홀수들만, 짝수는 짝수들만 연결시키고 그 head들을 연결시켰다.

최대한 간단하게 풀려는 시도를 많이 노력해야겠다는 생각이 든다.

profile
이제 3학년..

0개의 댓글