zoukankan      html  css  js  c++  java
  • 【Leetcode】Sort List JAVA实现

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

    1、分析

    该题主要考查了链接上的合并排序算法。

    2、正确代码实现

    package com.edu.leetcode;
    import com.edu.leetcode.ListNode;
    
    public class SortList {
    
        /**
         * @param args
         */
        public ListNode Merge(ListNode first,ListNode second){   //合并两个有序链表,并返回新链表的投结点
            ListNode rear;
            ListNode head;
            rear=head=new ListNode(-1);
            
            while(first!=null&&second!=null){
                if(first.val<=second.val){
                    rear.next=first;
                    rear=first;
                    first=first.next;
                }
                else{
                    rear.next=second;
                    rear=second;
                    second=second.next;
                }
            }
            if(first!=null)
                rear.next=first;
            else
                rear.next=second;
            
            return head.next;
        }
        
        public ListNode sortList(ListNode head){     
            /*
             * 实现链表的合并排序:1、将链表划分成基本相等的两个链表
             * 2、递归将这两个链接继续划分,直到链表的长度为0或者1为止
             * 3、调用Merge()将链接进行合并
             */
            
            if(head==null||head.next==null)
                return head;
            ListNode mid =head;
            ListNode pos =mid.next;
            while(pos!=null){
                pos=pos.next;
                if(pos!=null){
                    pos=pos.next;
                    mid=mid.next;
                }
            }
            ListNode q=sortList(mid.next);
            mid.next=null;
            return Merge(sortList(head), q);
        }
        
        
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ListNode first1 = new ListNode(0);
            ListNode rear1 =first1;
            
            for(int i=9;i>=1;i--){
                ListNode q= new ListNode(i);
                rear1.next=q;
                rear1=q;
            }
            ListNode q=first1;
            while(q!=null){
                System.out.print(q.val+ ",");
                q=q.next;
            }
            System.out.println();
            SortList sl = new SortList();
            sl.sortList(first1);
            
            ListNode p=first1;
            while(p!=null){
                System.out.print(p.val+ ",");
                p=p.next;
            }
            System.out.println();
        }
    
    }

    3、有点问题的代码

    这里的问题主要是将上面的SortList()方法分成两步实现:Divide()和MergeSort()两部分。个人觉得应该是一样的。但运行结果确实不同,如果大神浏览,请指点一下小弟。。

    class ListNode{
        int val;
        ListNode next=null;
        public ListNode(){
        }
        public ListNode(int val){
            this.val=val;
        }
    }
    
    
    public class SortList {
        
        public ListNode Merge(ListNode first,ListNode second){
            ListNode rear;
            ListNode head;
            rear=head=new ListNode();
            
            while(first!=null&&second!=null){
                if(first.val<=second.val){
                    rear.next=first;
                    rear=first;
                    first=first.next;
                }
                else{
                    rear.next=second;
                    rear=second;
                    second=second.next;
                }
            }
            if(first!=null)
                rear.next=first;
            else
                rear.next=second;
            
            return head.next;
        }
        
        public ListNode Divide(ListNode first){    //将一个链表划分成两个基本相等的子链表
            if(first==null)
                return null;
            ListNode mid =first;
            ListNode pos =mid.next;
            while(pos!=null){
                pos=pos.next;
                if(pos!=null){
                    pos=pos.next;
                    mid=mid.next;
                }
            }
            ListNode q=mid.next;
            mid.next=null;
            return q;
        }
        
        public void MergeSort(ListNode first){     //合并排序
            if(first!=null&&first.next!=null){
                ListNode second =Divide(first);     //将链表划分成两部分
                MergeSort(first);                    //递归
                MergeSort(second);
                Merge(first, second);
            }
            
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ListNode first1 = new ListNode(0);
            ListNode rear1 =first1;
            
            for(int i=9;i>=1;i--){
                ListNode q= new ListNode(i);
                rear1.next=q;
                rear1=q;
            }
            
            
            
            ListNode q=first1;
            while(q!=null){
                System.out.print(q.val+ ",");
                q=q.next;
            }
            System.out.println();
            SortList sl = new SortList();
            sl.MergeSort(first1);
            
            ListNode p=first1;
            while(p!=null){
                System.out.print(p.val+ ",");
                p=p.next;
            }
            System.out.println();
            
        }
    
    }
  • 相关阅读:
    资源-python 视频下载大全
    ubuntu 16.04(操作应用) -软件卸载
    资源-简历的相关知识
    centos (命令操作)-crontab命令
    ubuntu 16.04 (软件应用)-输入法
    ntp时间同步
    lvm空间扩容
    目录知识
    Linux下安装maven
    elasticsearch安装pinyin模块
  • 原文地址:https://www.cnblogs.com/rolly-yan/p/3999240.html
Copyright © 2011-2022 走看看