leetcode: Sort List, Merge sort solution. Java

Sort List  
https://leetcode.com/problems/sort-list/ 

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

Result:


My Solution:

import java.lang.Math.*;
public class Solution {

   
    public ListNode sortList(ListNode head) {
        //merge sort
        //3,5,7,9,1,2,6,8,10
        if(head==null) return null; //length=0
        if(head.next==null) {print(head,"head");return head;} //length=1
        	int length=getLength(head);//length=9
        	int middle=(int)Math.floor(length/2);//middle=4

        	//get the ListNode just before middle
        	ListNode tmp= indexAt(head, middle-1); //9, index@4
        	ListNode rightTmp=tmp.next; //rightTmp=1,2,6,8,10
        	tmp.next=null;	//head=3,5,7,9
        	ListNode leftTmp=head;//leftTmp=3,5,7,9
        	ListNode left=sortList(leftTmp); //left=3,5,7,9
        	ListNode right=sortList(rightTmp); //right=1,2,6,8,10
        	ListNode merged=merge(left,right);
       		return  merged;   
   		
    }

    
    /**
    *merge left and right
    */
    //left                , right
    // left>>3             right>> 5
    //merge
    //merge>> 0,1 
    public ListNode merge(ListNode left, ListNode right){
    	ListNode merged;
    	ListNode pointer;
    	if(left==null&&right!=null)  return right;
    	if(right==null&&left!=null)  return left;

    	//new merged
    	if(left.val<right.val){//3<5 true
    		//left<right
    		merged =new ListNode(left.val); //merged>>3
    		left=left.next;   //left=null, right=5
    	}else{//3>1
    		merged=new ListNode(right.val);
    		right=right.next;
    	}
    	pointer=merged; //pointer=1
    	//merge left & right
    	//*******************
    	//while left and right not null
    	while(left!=null && right!=null){ 
    		if(left.val<right.val){
    			//left<right
    			ListNode next=new ListNode(left.val);
    			pointer.next=next;
    			left=left.next;
    			//pointer ++
    			pointer=pointer.next;
    		}else{
    			//right<left
    			ListNode next=new ListNode(right.val);
    			pointer.next=next;
    			right=right.next;
    			//pointer ++
    			pointer=pointer.next;
    		}

    	}
    	//merge excess left  into merged
    	while(left!=null){
    		ListNode next=new ListNode(left.val);
    		pointer.next=next;
    		left=left.next;
    		//pointer ++
    		pointer=pointer.next;
    	}
    	//merge excess right into merged
    	while(right!=null){
    		ListNode next=new ListNode(right.val);
    		pointer.next=next;
    		right=right.next;
    		//pointer ++
    		pointer=pointer.next;
    	}

    return merged;
    }



    /**
    *get length
    */
    private int getLength(ListNode ln){
    	
    	int len=0;
    	while(ln!=null){
    		len++;
    		ln=ln.next;
    	}
    	return len;
    }

    /**
    *get ListNode at index
    */
    private ListNode indexAt(ListNode head, int index){
    	ListNode indexAt;
    	indexAt=head;		
    	for(int i=0;i<index;i++){
    		indexAt=indexAt.next;
    	}
    return indexAt;	
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值