在o(N log N)时间内使用恒定的空间复杂度对链表进行排序

时间复杂度要求为o(N log N)所以,排序方法采用归并排序

代码如下

package sort;

class ListNode {
    int val;
    ListNode next;

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

public class TestListNode {
        public ListNode sortList(ListNode head) {
            if(head==null||head.next==null){
                return head;
            }
            ListNode mid=getMid(head);
            ListNode midNext=mid.next;
            mid.next=null;//将链表断开
            return margeSort(sortList(head),sortList(midNext));
        }

private ListNode margeSort(ListNode sortList1, ListNode sortList2) {
            //定义头结点
            ListNode head  = new ListNode(0);
            //临时节点
            ListNode temp =head;
            ListNode n1 = sortList1;
            ListNode n2 = sortList2;
            while(n1!=null&&n2!=null){
                if(n1.val<n2.val){
                    temp.next=n1;
                    n1=n1.next;
                }else{
                    temp.next=n2;
                    n2=n2.next;
                }
                temp=temp.next;
            }
            temp.next=n1==null?n2:n1;
            //去掉没用的头结点
            return head.next;
        }

private ListNode getMid(ListNode head) {
            
            if(head==null||head.next==null){
                return head;
            }
            //利用快慢指针去找到 链表的中间节点
            ListNode fase = head;
            ListNode slow = head;
            while(fase.next!=null&&fase.next.next!=null){
                slow=slow.next;
                fase=fase.next.next;
            }
            return slow;
            
        }
        
        
    
}

原文地址:https://www.cnblogs.com/wanglingdeboke/p/9477985.html

时间: 2024-10-09 00:57:39

在o(N log N)时间内使用恒定的空间复杂度对链表进行排序的相关文章

log(n)时间内找出数组第i小的数字

参考算法导论9.2 R_Select(int *a,int p,int r,int i){ if(p==r) return a[p]; int q=partition(a,p,r); int k=q-p; if(i==k) return a[q]; else if(i<k) return R_Select(a,p,q-1,i); else return R_Select(a,q+1,r,i-k); } log(n)时间内找出数组第i小的数字

几种能在O(n*log(n))时间排序

线性时间排序 各种排序算法总结已经介绍了几种能在O(n*log(n))时间内培训n个数的算法.归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.这些算法都有一个有趣的性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类算法为比较算法,还有一类算法是线性时间复杂度的排序算法,有计数排序.基数排序和桶排序,当然,这些算法使用运算而不是比较来确定排序顺序的. 1 计数排序 计数排序假设n个输入元素中的每一个都是0到n区间的一个整数,其中n是某个整数.计数排序的思想是:

红黑树-wiki

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的.它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 目录 1 用途和好处 2 性质 3

最详细的红黑树解析

红黑树 红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组.它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的.它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 用途和好处 红黑树和AVL树

深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap 【中】

LinkedHashMap - 有序的 HashMap 我们之前讲过的 HashMap 的性能表现非常不错,因此使用的非常广泛.但是它有一个非常大的缺点,就是它内部的元素都是无序的.如果在遍历 map 的时候, 我们希望元素能够保持它被put进去时候的顺序,或者是元素被访问的先后顺序,就不得不使用 LinkedHashMap. LinkdHashMap 继承了 HashMap,因此,它具备了 HashMap 的优良特性-高性能.在HashMap 的基础上, LinkedHashMap 又在内部维

平衡二叉树

1.基础知识 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:1.它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.2.其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度.3.平衡二叉树的常用算法有红黑树.AVL.Treap等. 4.最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,

数据结构-红黑树

转自:http://dongxicheng.org/structure/red-black-tree/ 1. 简介 红黑树是一种自平衡二叉查找树.它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用.在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持).它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它

数据结构基础知识1

一. 理解并能快速.准确写出代码.(★★★★★) 1. 几种常见排序( 代码 ) 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置. 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边. 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置. 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边.并把它放在中间:递归地对左右子数组进

B-树、B+树、红黑树

B-树 B-tree树即B树,B即Balanced,平衡的意思,B-树又称为多路平衡查找树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为B-树是一种树,而B树又是另一种树.而事实上是,B-tree就是指的B树. 一.定义 B-树是一种多路搜索树(并不一定是二叉的) 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树.B_树). 一棵