lintcode-98-链表排序
98-链表排序
在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。
样例
给出 1->3->2->null,给它排序变成 1->2->3->null.
挑战
分别用归并排序和快速排序做一遍。
标签
链表
思路
采用归并排序(时间复杂度是O(nlogn)的排序有快速排序、归并排序、堆排序),使用快慢指针找出链表中点。
code
/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @param head: The first node of linked list.
     * @return: You should return the head of the sorted linked list,
                    using constant space complexity.
     */
    ListNode *sortList(ListNode *head) {
        // write your code here
        if(head == NULL || head->next == NULL) {
            return head;
        }
        ListNode *fast = head, *slow = head, *temp = head;;
        while(fast != NULL && fast->next != NULL) {
            temp = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        temp->next = NULL;
        return mergeList(sortList(head), sortList(slow));
    }
    ListNode *mergeList(ListNode *head1, ListNode *head2) {
        if(head1 == NULL) {
            return head2;
        }
        if(head2 == NULL) {
            return head1;
        }
        ListNode newHead(0);
        ListNode *temp = &newHead;
        while(head1 != NULL && head2 != NULL) {
            if(head1->val < head2->val) {
                temp->next = head1;
                head1 = head1->next;
            }
            else {
                temp->next = head2;
                head2 = head2->next;
            }
            temp = temp->next;
        }
        if(head1 != NULL) {
            temp->next = head1;
        }
        else if(head2 != NULL) {
            temp->next = head2;
        }
        return newHead.next;
    }
};
												
											lintcode-98-链表排序的更多相关文章
- C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
		
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
 - c语言:链表排序, 链表反转
		
下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...
 - 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述
		
关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...
 - 【模板小程序】链表排序(qsort/insert_sort/merge_sort)
		
前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操 ...
 - 常见的链表排序(Java版)
		
上篇博客中讲解了九大内部排序算法,部分算法还提供了代码实现,但是那些代码实现都是基于数组进行排序的,本篇博客就以链表排序实现几种常见的排序算法,以飨读者. 快速排序的链表实现 算法思想:对于一个链表, ...
 - Leetcode:148_Sort List | O(nlogn)链表排序 | Medium
		
题目:Sort List Sort a linked list in O(n log n) time using constant space complexity 看题目有两个要求:1)时间复杂度为 ...
 - 148. Sort List (java 给单链表排序)
		
题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn) ...
 - 给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...
		
链表排序 · Sort List [抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: quick ...
 - STL 中的链表排序
		
一直以来学习排序算法, 都没有在链表排序上下太多功夫,因为用得不多.最近看STL源码,才发现,原来即使是链表,也能有时间复杂度为O(nlogn)的算法, 大大出乎我的意料之外,一般就能想到个插入排序. ...
 - 算法基础~链表~排序链表的合并(k条)
		
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
 
随机推荐
- SQL0668N  不允许对表XX执行操作,原因码为 "3"
			
DB2 Load导入数据失败之后,表被锁,提示,SQL0668N 不允许对表XX执行操作,原因码为 "3". 之前也遇到过,当时都是现查现用的,现在在博客记一下,以备后查. 解决方 ...
 - React性能优化总结(转)
			
原文链接: https://segmentfault.com/a/1190000007811296?utm_source=tuicool&utm_medium=referral 初学者对Rea ...
 - NEC html规范
			
HTML规范 - 整体结构 HTML基础设施 文件应以“<!DOCTYPE ......>”首行顶格开始,推荐使用“<!DOCTYPE html>”. 必须申明文档的编码cha ...
 - 【CodeForces 803 C】Maximal GCD(GCD+思维)
			
You are given positive integer number n. You should create such strictly increasingsequence of k pos ...
 - ABAP术语-Business Framework Architecture
			
Business Framework Architecture 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/29/1019277.html ...
 - 小程序swiper不显示图片
			
按照文档上的代码运行后,发现图片不显示 解决办法: app.wxss文件 align-items: center;这句话删除了,运行 OK!
 - 使用Cygwin在WIN系统下处理文本常用命令
			
1.打开Cygwin,把需要处理的文本复制你的安装目录例如:D:\cygwin\home\Administrator 使用 ls命令查看根目录文件 2.现在我们就可以对1.txt文本进行操作, 3.我 ...
 - collections模块的使用
			
1. Counter counter是collections中的一个模块, 它能够统计出字符串/文本中的每一个元素出现的次数, 并可以对结果进行进一步的处理. 使用方法 传入: 字符串 默认返回: C ...
 - Python正则表达式-基础
			
Python正则表达式-基础 本文转载自昔日暖阳,原文地址:http://www.osheep.cn/4806.html python使用正则,需要先引入re模块 import re 匹配符 单个字符 ...
 - 谭浩强第四版第九章课后习题12>>>建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,若链表 中的结点所包含的年龄等于此年龄,则删除此结点。
			
#include<stdio.h> #include<stdlib.h> #define N sizeof(link) typedef struct lin { struct ...