LeetCode OJ:Sort List(排序链表)
Sort a linked list in O(n log n) time using constant space complexity.
题目要求在常数控件内以O(nlogn)的事件复杂度来排序链表。
常数空间内我没有实现,O(nlogn)的话使用归并排序就可以了吗, 下面是代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head || !head->next)
return head;
return mergeSort(head);
} ListNode * mergeSort(ListNode * head)
{
if(head == NULL || head->next == NULL) return head;
ListNode * fastP = head;
ListNode * slowP = head;
ListNode * slowPre = slowP; //这里生成快慢指针的时候应该注意一点,选一个pre节点,否则直接用slowP的话那么分成的两段是不平衡的
for(; fastP != NULL && fastP->next != NULL; fastP = fastP->next->next, slowP = slowP->next){
slowPre = slowP;
}
ListNode * head1 = head;
ListNode * head2 = slowP;
slowPre->next = NULL;//截断list
head1 = mergeSort(head1);
head2 = mergeSort(head2);
return merge(head1, head2);
} ListNode * merge(ListNode * head1, ListNode * head2)
{
ListNode * ret = new ListNode(); //记录首节点的位置
ListNode * helper = ret; //这里应该注意,helper是用来标记下一个插入位置用的。
while(head1 && head2){
if(head1->val < head2->val){
helper->next = head1;
head1 = head1->next;
}else{
helper->next = head2;
head2 = head2->next;
}
helper = helper->next;//指向当前链表的尾节点
}
if(head1 == NULL)
helper->next = head2;
else
helper->next = head1;
helper = ret->next;
ret->next = NULL; //销毁helper节点
delete ret;
return helper;
} };
下面的事java版,写了很多的局部变量,主要事图个方便啊,方法与上相同,可以满足题目的限制条件。代码如下所示:
public class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null)
return head;
return mergeSort(head);
}
public ListNode mergeSort(ListNode head){
if(head == null || head.next == null) return head;
ListNode fast = head;
ListNode slow = head;
ListNode slowPre = new ListNode(-1);
slowPre.next = head;
while(fast != null){
fast = fast.next;
slow = slow.next;
slowPre = slowPre.next;
if(fast != null)
fast = fast.next;
}
ListNode list1 = head;
ListNode list2 = slow;
slowPre.next = null;
list1 = mergeSort(list1);
list2 = mergeSort(list2);
return merge(list1, list2);
}
public ListNode merge(ListNode head1, ListNode head2){
if(head1 == null) return head2;
if(head2 == null) return head1;
ListNode helperP = new ListNode(-1);
helperP.next = head1;
ListNode pPre = helperP;
ListNode p = head1;
ListNode helperQ = new ListNode(-1);
helperQ.next = head2;
ListNode qPre = helperQ;
ListNode q = head2;
while(p != null && q != null){
if(p.val < q.val){
p=p.next;
pPre = pPre.next;
}else{
pPre.next = q;
qPre.next = q.next;
q.next = p;
q = qPre.next;
pPre = pPre.next;
}
}
if(p == null){
pPre.next = helperQ.next;
helperQ.next = null;
}
return helperP.next;
}
}
LeetCode OJ:Sort List(排序链表)的更多相关文章
- LeetCode - 82、删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1 ...
- LeetCode - 83、删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3 ...
- [LeetCode] Wiggle Sort 摆动排序
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
问题 给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树. 初始思路 二叉搜索树高度平衡,意味着左右子树的高度要平衡.根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我 ...
- [Leetcode] 第148题 排序链表
一.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示 ...
- Leetcode148. Sort List排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入 ...
- [LeetCode OJ] Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- leetcode——Insertion Sort List 对链表进行插入排序(AC)
Sort a linked list using insertion sort. class Solution { public: ListNode *insertionSortList(ListNo ...
- [LeetCode题解]83. 删除排序链表中的重复元素 | 递归 + 迭代
方法一:递归 解题思路 通过递归法,每次判断目前头节点与给定的节点是否相等.如是,继续判断下一个节点,否则保存当前头节点,设置 next 指向下次递归得到的节点,然后返回当前节点. 代码 /** * ...
- LeetCode【83. 删除排序链表中的重复元素】
我最开始的程序是 但是结果
随机推荐
- 001-unity3d简介以及界面说明
一.简介 学习路线1.C#.网络[http,socket]io2.GUI.NGUI.2DToolKit3.3D控制.物理引擎.角色控制4.粒子系统.音频等5.android.IOS开发基础6.sock ...
- Python基础-os和sys模块
os模块提供对操作系统进行调用的接口 import os os.getcwd() # 获取当前工作目录 os.chdir(r'd:\fansik') # 修改对当前工作目录 print(os.curd ...
- SaltStack安装配置
一.环境准备:操作系统CentOS Linux release 7.3.1611master ip:192.168.1.180minion ip:192.168.1.183设置server(maste ...
- DOM加载过程
静态的dom 动态的dom http://blog.csdn.net/cxiaokai/article/details/7552653 一:预编译 解释 js加 ...
- MSDN使用
比如我想查一下fopen这个函数怎么用,在索引里搜索一下fopen,很容易找到了. 但是如果我想横向扩展一下,查看一些与fopen相关的函数,应该怎么找呢? 很简单,点击定位: 你就能把fopen定位 ...
- iOS获取某个日期后n个月的日期
一.给一个时间,给一个数,正数是以后n个月,负数是前n个月: -(NSDate *)getPriousorLaterDateFromDate:(NSDate *)date withMonth:(NSI ...
- IMX6Q RTC驱动分析
对于在工作中学习驱动的,讲究的是先使用,再理解.好吧,我们来看看板子里是如何注册的? 在板文件里,它的注册函数是这样的: imx6q_add_imx_snvs_rtc() 好吧,让我们追踪下去: 1 ...
- 【Head First Servlets and JSP】笔记4:HttpServletRequest req
api:https://tomcat.apache.org/tomcat-5.5-doc/servletapi/ 1.GET和POST除去数据大小之外的区别. 安全性问题.使用GET的话,参数数据会出 ...
- Go make 和 new的区别
在Go语言中: make 被用来分配引用类型的内存: map, slice, channel new 被用来分配除了引用类型的所有其他类型的内存: int, string, array等 本文主要给大 ...
- HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...