题解 | #单链表的排序#TOP12

思路:
1.题目是O(Nlog(n))时间负责度,当然我们第一眼可能想到,直接用辅助数组排序,然后将辅助数组辅助到链表上,可以做到数组时间O(Nlog(n)),但是数组空间O(N),题目没说,也是可以的
2.用归并排序,自顶向下,时间复杂度O(Nlog(N)),无空间消耗,拆分后就是合并两个有序的链表而已。


/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) {
        // write code here
        if(head == null || head.next == null){
            return head;
        }
//         List<Integer> temp = new ArrayList<>();
        
//        ListNode currentNode = head;
//         while(currentNode != null){
//             temp.add(currentNode.val);
//             currentNode = currentNode.next;
//         }
//         int[] data = new int[temp.size()];
//         for(int i = 0;i<temp.size();i++){
//             data[i] = temp.get(i);
//         }
        
//         Arrays.sort(data);
        
//         ListNode newHead = new ListNode(-1);
//         ListNode tempNode = newHead;
//         for(int i : data){
//             ListNode  cur = new ListNode(i);
//             tempNode.next = cur;
//             tempNode = cur;
//         }
        //题目是时间负责度O(NlogN)
        //使用归并排序,自顶向下
        ListNode fast = head.next, slow  = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        //[head , slow], [temp, end];
        ListNode temp = slow.next;
        slow.next = null;
        ListNode left = sortInList(head);
        ListNode right = sortInList(temp);
        ListNode newHead = new ListNode(-1);
        ListNode currentNode = newHead;
        while(left != null && right != null){
            if(left.val < right.val){
                currentNode.next = left;
                left = left.next;
            }else{
                currentNode.next=  right;
                right = right.next;
                
            }
            currentNode = currentNode.next;
        }
        currentNode.next = left != null ? left :right;
        return newHead.next;
    }
}
面试必刷TOP101 文章被收录于专栏

面试必刷TOP101

全部评论

相关推荐

思念SiN:你这里没有通过的主要原因应该是计算平均分数的时候,在你贴的代码的第23行: ```c b[i]=(sum-max-min)/(m-2); ``` 等式的右边实际上是两个`int`类型的变量在做除法,C语言里面得到的结果会是这个除法的整数部分,余数部分被舍弃了,也不会自动变成浮点数去做除法。所以虽然你使用了`b[i]`这个浮点数去接收结果,但是等式右边除法是先得到了一个整数,然后再被转换为浮点数再赋值给了`b[i]`。你可以按下面这样,在做除法之前,先进行类型转换,就能得到期望的结果: ```c b[i]=(float)(sum-max-min)/(float)(m-2); ```
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务