算法

链表排序

2020-10-17  本文已影响0人  小鱼嘻嘻

问题1

在 O(n ^2) 时间复杂度和常数级空间复杂度下,对链表进行排序。

原理

代码

class Solution {
    public ListNode insertionSortList(ListNode head) {
        if(head==null){
            return head;
        }
        ListNode newHead = new ListNode(-1);
        ListNode run = newHead.next;
        ListNode pre = newHead;
        while(head!=null){
            ListNode dump = head;
            head = head.next;
            while(run!=null&&run.val<dump.val){
                pre = run;
                run = run.next;
            }
            
            pre.next = dump;
            dump.next = run;

            pre = newHead;
            run = newHead.next;
        }

        return newHead.next;
    }
}

注意事项

问题2

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

原理

代码

class Solution {
    public ListNode sortList(ListNode head) {
        // terminate
        if(head==null||head.next==null){
            return head;
        }

        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = head;
        while(fast!=null&&fast.next!=null){
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }

        // two linkedlist
        pre.next = null;

       ListNode left =  sortList(head);
       ListNode right =  sortList(slow);

       return merge(left,right);


    }


    private ListNode merge(ListNode left,ListNode right){
        ListNode newHead = new ListNode(-1);
        ListNode run = newHead;

        while(left!=null||right!=null){
            if(left==null){
                run.next = right;
                right = right.next;
            }else if(right==null){
                run.next = left;
                left = left.next;
            }else if(left.val<right.val){
                run.next = left;
                left = left.next;
            }else{
                run.next = right;
                right = right.next;
            }
            run = run.next;
        }
        
        return newHead.next;
    }
}

注意事项

问题3

对链表做快速排序

原理

代码

public class QuickSort {
  private static void quickSort(LinkedNode head, LinkedNode end) {
    if (head == end) {
      return;
    }
    LinkedNode partion = partion(head, end);
    quickSort(head, partion);
    quickSort(partion.next, end);
  }

  private static LinkedNode partion(LinkedNode head, LinkedNode end) {
    LinkedNode p = head;
    LinkedNode q = head.next;
    while (q != end) {
      // 如果q.val<cur change
      if (q.val < head.val) {
        p = p.next;
        int t = q.val;
        q.val = p.val;
        p.val = t;
      }
      q = q.next;
    }
    if (p != head) {
      int t = p.val;
      p.val = head.val;
      head.val = t;
    }

    return p;
  }
}

注意事项

上一篇 下一篇

猜你喜欢

热点阅读