博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
148. Sort List
阅读量:2351 次
发布时间:2019-05-10

本文共 3179 字,大约阅读时间需要 10 分钟。

Sort a linked list in O(n log n) time using constant space complexity.

Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

我的想法

感觉用归并排序不会太复杂,但是实际写的时候越写越晕。

以下代码并不对,只是为了记录

class Solution {
public ListNode sortList(ListNode head) {
ListNode dummy = new ListNode(-1); ListNode end = head; while(end.next != null) {
end = end.next; } mergeSort(dummy, head, end, null); return dummy.next; } private void mergeSort(ListNode first, ListNode start, ListNode end, ListNode last) {
if(start == end) {
return; } ListNode fast = start, low = start; if(start.next == end) {
low = start; } else {
while(fast != end && fast.next != null) {
fast = fast.next.next; low = low.next; } } mergeSort(first, start, low, low.next); mergeSort(low, low.next, end, last); merge(first, start, end, low, last); } private void merge(ListNode first, ListNode start, ListNode end, ListNode mid, ListNode last) {
ListNode head = first; ListNode left = start, right = mid.next; while(left != mid.next && right != null && right != end.next) {
//这样写忽略了这是一个链表 if(left.val < right.val) {
head.next = left; head = head.next; left = left.next; } else {
head.next = right; head = head.next; right = right.next; } } while(left != mid.next) {
head.next = left; head = head.next; left = left.next; } while(right != null && right != end.next) {
head.next = right; head = head.next; right = right.next; } head.next = last; }}

解答

jiuzhang solution

class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head; } ListNode mid = findMid(head); ListNode right = sortList(mid.next); //这里切断,方便之后的拼接 mid.next = null; ListNode left = sortList(head); return merge(left, right); } private ListNode merge(ListNode left, ListNode right) {
ListNode dummy = new ListNode(-1); ListNode head = dummy; while(left != null && right != null) {
if(left.val < right.val) {
head.next = left; left = left.next; } else {
head.next = right; right = right.next; } head = head.next; } if(left != null) {
head.next = left; } else {
head.next = right; } return dummy.next; } private ListNode findMid(ListNode head) {
//注意这里fast的起点比low要往后,这样保证每个小段(即使是长度为2的)都能拆分成长度为1的段 ListNode fast = head.next, low = head; while(fast != null && fast.next != null) {
fast = fast.next.next; low = low.next; } return low; }}

转载地址:http://nyqvb.baihongyu.com/

你可能感兴趣的文章
PHP类中的抽象类,抽象方法,abstract
查看>>
PHP接口类interface的正确使用方法
查看>>
Sencha Touch之Hello World
查看>>
Tab Layout 之单个Activity实现
查看>>
Tab Layout 之多个Activity实现
查看>>
FrameLayout之我见
查看>>
个人解读Activity之一
查看>>
实现自定义布局的Notification
查看>>
AlarmManager的学习与实现
查看>>
解读Content Provider之一
查看>>
解读Content Provider之二
查看>>
自定义UI实例
查看>>
推荐一个不错的自定义UI
查看>>
fedora16 设置 gedit软件的默认编码
查看>>
S3C6410 存储器映射
查看>>
Linux 3.3.0移植到S3C6410开发板上之一
查看>>
Busybox支持中文的解决办法
查看>>
Spring中BeanFactory和FactoryBean有什么区别?
查看>>
牛年(2021)的KPI
查看>>
快速识别图片类型
查看>>