单链表排序

原创 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;
        }
    }
}

单链表之排序

题:编程实现单链表的排序。 答案:完整代码如下: // P167_example1.cpp : Defines the entry point for the console applicatio...
  • jimoshuicao
  • jimoshuicao
  • 2013年07月30日 16:40
  • 2987

实现单链表的排序(递增)

node *sort(node *head) // 单链表的排序 { printf("单链表的排序:\n"); node *p, *p2, *p3; int n = length(head), ...
  • taotaoah
  • taotaoah
  • 2015年09月30日 19:54
  • 1194

用c++写的单链表排序

头文件node.h#pragma once template class Node { public: T data; Node * next; Node(); Node(T data, N...
  • Doraemon___
  • Doraemon___
  • 2016年11月18日 21:12
  • 1477

在单链表上实现插入排序

问题:给单链表排序(升序排列,要保持稳定性),要求通过改变结点的next指针从而改变结点的位置,而不是只交换结点的值来使得其有序!时间复杂度为O(N^2),空间复杂度为O(1)。...
  • Jacketinsysu
  • Jacketinsysu
  • 2016年09月17日 20:10
  • 3834

单链表排序----快排 & 归并排序

题目描述:   给定一个乱序的单链表的头节点,对该链表中的节点进行排序    要求时间复杂度为O(nlgn),空间复杂度为O(1)        分析:   由于题目要求时间复杂度我...
  • u012658346
  • u012658346
  • 2016年04月13日 10:48
  • 8460

单链表的合并,排序与翻转

1.单链表的合并:   合并两个有序(从小到大)链表,首先比较两链表第一个结点值的大小,将小的放入新的链表(创建的临时链表);然后将小的那条链表向后移动一个位置,重复比较。当然,在进行这些处理之前,先...
  • zhu_931
  • zhu_931
  • 2017年03月15日 23:11
  • 726

单链表排序、逆序

   对单链表进行排序,我这里选择冒泡排序,选择对其关键字进行排序;而不选择交换结点。把链表逆序的话,基本思路就是使两结点之间的指向变反,也就是p1->p2变为p2->p1;把第一个结点的指针域设为N...
  • EdgarSun
  • EdgarSun
  • 2006年01月24日 23:07
  • 11477

用直接插入排序法对单链表进行排序

#include typedef struct node { int key; struct node *next; }SNode; void CreateLink (SNode *h,...
  • gxf1123
  • gxf1123
  • 2014年12月22日 14:19
  • 454

单链表的基本操作(建立,输出及排序)

今天总结了一下单链表的基本操作:建立,求单链表长度,单//尾插法,新建一个链表 ListNode *creatList( ) { ListNode *head,*p,*s; int x...
  • xiaominkong123
  • xiaominkong123
  • 2016年08月08日 17:08
  • 1517

单链表排序(sort list)

昨晚被阿里在线笔试虐了,附加题完全不会,第二题
  • Acceptedxukai
  • Acceptedxukai
  • 2014年08月30日 11:19
  • 3447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表排序
举报原因:
原因补充:

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