zoukankan      html  css  js  c++  java
  • sort-list

    算法:在O(n log n)的时间内使用常数级空间复杂度对链表进行排序

    package com.niuke.p4;
    
    /*
     * public class ListNode {
     *   int val;
     *   ListNode next = null;
     * }
     */
    
    public class Solution {
        /**
         * 
         * @param head ListNode类 
         * @return ListNode类
         */
        public ListNode sortList (ListNode head) {
            // write code here
            if(head == null ||head.next==null) {
                return head;
            }
            
            //获取中间节点
            ListNode mid = getMiddle(head);
            //断开
            ListNode midNext = mid.next;
            mid.next = null;
            
            //排序,合并
            return mergeTwoLists(sortList(head),sortList(midNext));
        }
        
        /**
         * 获取链表的中间节点,偶数时取中间第一个
         * @param head
         * @return
         */
        public ListNode getMiddle(ListNode head) {
            if(head == null || head.next == null) {
                return head;
            }
            
            //快慢指针
            ListNode fast,slow;
            fast = head;
            slow = head;
            //快两步,慢一步
            while(fast.next != null && fast.next.next != null) {
                //偶数时取第一个
                fast = fast.next.next;
                slow = slow.next;
            }
            return slow;
        }
        
        /**
         * 实现合并两个已经排序的链表
         * @param l1
         * @param l2
         * @return
         */
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            //特殊情况
            if(l1 == null) {
                return l2;
            }
            if(l2 == null) {
                return l1;
            }
            ListNode first = l1.next,second=l2.next;
            ListNode res,newHead;//结果
            if(l1.val <l2.val) {
                newHead = res = l1;
                second = l2;
            }else {
                newHead = res = l2;
                first = l1;
            }
            while(first != null || second != null) {
                if(first == null) {//第一条链表没了
                    res.next = second;
                    return newHead;
                }else if(second == null) {//第二条链表没了
                    res.next = first;
                    return newHead;
                }else if(first.val < second.val) {//第一个值小
                    res.next = first;
                    first = first.next;
                    res = res.next;
                }else {
                    res.next = second;
                    second = second.next;
                    res = res.next;
                }
            }
            return newHead;
        }
    }
  • 相关阅读:
    Java 解惑:Random 种子的作用、含参与不含参构造函数区别
    Linux系统网络性能实例分析
    数据库服务器的性能调优-续
    Spring代理模式及AOP基本术语
    Spring框架总结
    单例模式和多例模式
    jqueryUI小案例
    Ajax讲解
    数据校验和国际化
    文件上传(多文件上传)/下载
  • 原文地址:https://www.cnblogs.com/LoganChen/p/12990042.html
Copyright © 2011-2022 走看看