单链表排序

原创 2016年05月30日 20:16:37
import java.util.ArrayList;
import java.util.List;

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    //快速排序
    public ListNode sortList(ListNode head){
        if(head == null){
            return null;
        }

        ListNode pivot = head;
        head = head.next;
        if(head == null){
            pivot.next = null;
            return pivot;
        }

        ListNode leftHead = new ListNode(0);
        ListNode rightHead = new ListNode(0);
        ListNode leftTail = leftHead;
        ListNode pivotTail = pivot;
        ListNode rightTail = rightHead;

        while (head != null){
            if(head.val < pivot.val){
                leftTail.next = head;
                leftTail = leftTail.next;
            }else if(head.val == pivot.val){
                pivotTail.next = head;
                pivotTail = pivotTail.next;
            }else {
                rightTail.next = head;
                rightTail = rightTail.next;
            }
            head = head.next;
        }

        leftTail.next = null;
        pivotTail.next = null;
        rightTail.next = null;

        ListNode leftReturnHead = sortList(leftHead.next);

        if(leftReturnHead == null){
            leftReturnHead = pivot;
        }else {
            ListNode connectLeftRight = leftReturnHead;
            while (connectLeftRight.next != null){
                connectLeftRight = connectLeftRight.next;
            }
            connectLeftRight.next = pivot;
        }

        pivotTail.next = sortList(rightHead.next);
        return leftReturnHead;
    }

    //归并排序
    public ListNode mergeTwoSortedList(ListNode leftHead, ListNode rightHead){
        ListNode result = new ListNode(0);
        ListNode resultHead = result;
        while (leftHead != null && rightHead != null){
            if (leftHead.val < rightHead.val){
                result.next = leftHead;
                leftHead = leftHead.next;
            }else {
                result.next = rightHead;
                rightHead = rightHead.next;
            }
            result = result.next;
        }

        if(leftHead != null){
            result.next = leftHead;
        }else {
            result.next = rightHead;
        }

        return resultHead.next;
    }

    public ListNode sortList1(ListNode head){
        if(head == null || head.next == null){
            return head;
        }

        ListNode slowPointer = head;
        ListNode fastPointer = head;
        ListNode prePointer = head;
        while (fastPointer != null && fastPointer.next != null){
            prePointer = slowPointer;
            slowPointer = slowPointer.next;
            fastPointer = fastPointer.next.next;
        }

        prePointer.next = null;
        ListNode leftHead = sortList1(head);
        ListNode rightHead = sortList1(slowPointer);

        return mergeTwoSortedList(leftHead, rightHead);
    }


    //转换为数组处理
    public ListNode sortList2(ListNode head){
        if(head == null || head.next == null){
            return head;
        }

        List<ListNode> arrayList = new ArrayList<>();

        while (head != null){
            arrayList.add(head);
            head = head.next;
        }

        ListNode result = new ListNode(0);
        ListNode resultHead = result;
        arrayList.sort((node1,node2)->Integer.compare(node1.val, node2.val));
        for(ListNode node : arrayList){
            result.next = node;
            result = result.next;
        }
        result.next = null;
        return resultHead.next;
    }

    public static void main(String[] args){
        ListNode head = new ListNode(3);
        ListNode one = new ListNode(3);
        ListNode two = new ListNode(1);
        ListNode three = new ListNode(2);
        head.next = one;
        one.next = two;
        two.next = three;
        three.next = null;
        ListNode re = new Solution().sortList(head);
        while (re != null){
            System.out.print(re.val + " ");
            re = re.next;
        }
    }
}

单链表快速排序

  • 2017年11月03日 09:36
  • 3KB
  • 下载

单链表排序和多项式分解

  • 2012年07月18日 21:50
  • 3KB
  • 下载

常见笔试面试题:实现一个递增排序的单链表

题目:实现一个递增排序的单链表,即每次向链表中插入一个或多个元素后都能保证链表仍是递增有序的。 为了实现该功能,首先定义一个头文件linked_list.h声明单链表的基本操作: #ifndef LI...

单链表逆序与排序

  • 2013年07月09日 14:56
  • 2KB
  • 下载

基于单链表的直接插入排序算法和代码实现

在链表上对直接插入排序算法的思想描述如下: 在带头结点的单链表L 中,如果将已有元素进行升序(或降序)排列,可先将原单链表L 暂时断成两条短链L1和L2,新链L1的头结点用原链L 的头结点(head...
  • ymwvs
  • ymwvs
  • 2014年04月15日 14:34
  • 2733

数据结构C++单链表冒泡法排序

  • 2017年12月06日 14:22
  • 2KB
  • 下载

用单链表和队列实现归并排序

  • 2015年06月30日 15:18
  • 160KB
  • 下载

程序员面试宝典(第三版)——单链表的基本操作:建立,求长度,输出,排序,插入,删除,逆置

总结:单链表的基本操作,包括建立单链表,对单链表求长度,打印输出单链表,对单链表进行排序,删除元素,插入元素,对单链表逆置。这些操作都是程序员必须掌握的,虽然它是一种相对简单的数据结构,但是能够做到熟...
  • xmh1954
  • xmh1954
  • 2014年07月27日 20:41
  • 1196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表排序
举报原因:
原因补充:

(最多只允许输入30个字)