LeetCode148. Sort List

1596 단어
Sort a linked list in O(nlogn) time using constant space complexity
사고방식: 병합 정렬
  • 주 함수 귀속 호출, 귀속 종료 조건을 정의합니다
  • 체인 시계의 중점을 찾아 각각 앞뒤 두 부분을 정렬한다
  • 두 개를 합치면 이미 질서정연한 목록이다
  •   /** sort a list. */
      public ListNode sortList(ListNode head) {
        if (head == null || head.next == null)
          return head;
        if (head.next.next == null){
          sort2Nodes(head, head.next);
        }
        else {
          ListNode mid = findMid(head);
          head = sortList(head);
          mid = sortList(mid);
          if(head.val > mid.val){
            ListNode tmp = head;
            head = mid;
            mid = tmp;
          }
          mergeList(head, mid);
        }
        return head;
      }
    
      /** merge two ordered lists. */
      private void mergeList(ListNode p1, ListNode p2) {
        while(p1.next != null && p2 != null){
          if(p1.val <= p2.val && p1.next.val > p2.val) {
            ListNode tmp = p1.next;
            ListNode tmp0 = p2.next;
            p1.next = p2;
            p2.next = tmp;
            p2 = tmp0;
          }
          p1 = p1.next;
        }
        if (p2 != null)
          p1.next = p2;
      }
    
      /** find middle node. */
      private ListNode findMid(ListNode head) {
        ListNode p1 = head, p2 = head.next.next, tmp;
        while (p2 != null && p2.next != null) {
          p1 = p1.next;
          p2 = p2.next.next;
        }
        tmp = p1.next;
        p1.next = null;
        return tmp;
      }
    
      /** sort list with only two nodes. */
      private void sort2Nodes(ListNode p1, ListNode p2) {
        if (p1.val > p2.val){
          int tmp = p2.val;
          p2.val = p1.val;
          p1.val = tmp;
        }
      }
    ```````

    좋은 웹페이지 즐겨찾기