(148)-(Sort List )-(用nlogn实现排序,可以用快排,归并和堆排序)-(我对于分治始终不能很好地掌握)

(148)-(Sort List )-(用nlogn实现排序,可以用快排,归并和堆排序)-(我对于分治始终不能很好地掌握)

其中归并的最坏时间复杂度为N平方

//用nlogn实现排序

//归并排序和快速排序都可以实现这个要求,
//首先归并做一次吧。嗯


//典型的分治思想
//【2】internalMergeSort(int []a ,int left,int right) 反复调用 internalMergeSort internalMergeSort 和MergeSortedArray(a,b,left,middle,right)
//【3】MergeSortedArray(int []a,int left,int middle,int right)  //left和middle+1控制下界,middle和right控制上界 都是操作a的,结果保存在temp中

public class Solution 
{  
    public ListNode sortList(ListNode head) 
    {  
        if (head == null || head.next == null) 
        {  
            return head;  
        }  
  
        ListNode fast = head;  
        ListNode slow = head;  
  
        while (fast.next != null) 
        {  
            fast = fast.next.next;  
            if (fast == null)
            {  
                break;  
            }  
              slow = slow.next;  
        }  
          //利用快慢指针直接找到链表的中点
        ListNode right = slow.next;  
        
        //这里意味着通过slow对head进行截断右边的操作
        slow.next = null;  
  
          //截断后的head,此时仅仅表示左边,
        //对左边进行处理
        ListNode left = sortList(head);  
        
        //对右边进行处理
        right = sortList(right);  
  
        return mergeTwoLists(left, right);  
    }  
      
      
    public ListNode mergeTwoLists(ListNode fir_head, ListNode sec_head)
    {  
        if (fir_head == null)
        {  
            return sec_head;  
        }  
        if (sec_head == null) 
        {  
            return fir_head;  
        }  
  
        ListNode final_ans = new ListNode(0);  
        ListNode r_ans=final_ans;
  
        while (fir_head != null && sec_head != null)
        {  
            if (fir_head.val <= sec_head.val) 
            {  
                r_ans.next =fir_head;  
                r_ans=r_ans.next;
                fir_head=fir_head.next;  
            } 
            else 
            {  
                r_ans.next=sec_head;
                r_ans=r_ans.next;
                sec_head=sec_head.next;  
            }  
        }  
  
        if (fir_head != null) 
        {  
            r_ans.next =fir_head;  
            r_ans=r_ans.next;
            fir_head=fir_head.next;  
        } 
         
        if (sec_head != null) 
        {  
            r_ans.next=sec_head;
            r_ans=r_ans.next;
            sec_head=sec_head.next;  
        }  
        return final_ans.next;  
    }  
}  

 

posted @ 2015-07-26 21:36  爱吃萝卜干  阅读(106)  评论(0编辑  收藏  举报