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

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

题目:

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

解答:

(对于discuss中第二个最优解的解释)
根据时间复杂度的要求,很容易想到应该用merge sort的方法来做,那么就有两个步骤,分和法。先把整个list分成两部分,这里可以用找中间值的方法,在找中间值的同时,标记一下中间值的前一个node,也就是第一个list的最后一个node,然后找到中间值之前,将最后一个node的下一位标记为null,就成功地将这个list分成了两部分;接下来是merge, 那就建一个新的list,将两个sort好的list按最小数的大小依次放进新list中,最后返回merge的list。解法如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) return head;                //seperate the list into two parts        //Track the last node of first list and point the end to null        ListNode prev = null;        ListNode slow = head, fast = head;        while (fast != null && fast.next != null) {            prev = slow;            slow = slow.next;            fast = fast.next.next;        }        prev.next = null;        ListNode l1 = sortList(head);        ListNode l2 = sortList(slow);                return merge(l1, l2);    }        public ListNode merge(ListNode l1, ListNode l2) {        ListNode dummy = new ListNode(0);        ListNode l = dummy;        while (l1 != null && l2 != null) {            if (l1.val < l2.val) {                l.next = l1;                l1 = l1.next;            } else {                l.next = l2;                l2 = l2.next;            }            l = l.next;        }                while (l1 != null) {            l.next = l1;            l1 = l1.next;            l = l.next;        }        while (l2 != null) {            l.next = l2;            l2 = l2.next;            l = l.next;        }                return dummy.next;    }}

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

你可能感兴趣的文章
技能点
查看>>
读书笔记《乌合之众》
查看>>
Hadoop日记Day1---Hadoop介绍
查看>>
iOS 学习资料汇总
查看>>
centos7 yum安装jdk
查看>>
Bluedroid与BluZ,蓝牙测试方法的变动(基于bludroid和BlueZ的对比)
查看>>
接口和抽象类有什么区别
查看>>
Linux 下添加用户,修改权限
查看>>
请问view controller scene,该如何删除
查看>>
bootstrap新闻模块样式模板
查看>>
zzzzw_在线考试系统①准备篇
查看>>
App Store 审核被拒的23个理由
查看>>
剑指offer第二版-1.赋值运算符函数
查看>>
javascript 对象
查看>>
Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
查看>>
Echart:前端很好的数据图表展现工具+demo
查看>>
CATransform3D iOS动画特效详解
查看>>
Linux VNC黑屏(转)
查看>>
Java反射简介
查看>>
react脚手架应用以及iview安装
查看>>