排序链表

https://leetcode-cn.com/problems/sort-list/submissions/

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
     return head==null?null:mergeSort(head);
    }
    public ListNode mergeSort(ListNode head){
      if (head.next == null){
          return head;
      }
      ListNode tmp=head;
      int length=0;
      while(tmp!=null){
          tmp=tmp.next;
          length++;
      }
      ListNode res=new ListNode();
      res.next=head;
     for(int i=1;i<length;i<<=1){
         ListNode current=res.next;
         ListNode data=res;
         while(current!=null){
             ListNode left=current;
             int count=1;
             while(current!=null&&count<i){
                 current=current.next;
                 count++;
             }
             ListNode right=current;
            if(current!=null){
             tmp=current.next;
             current.next=null;
             current=tmp;
             right=current;
             count=1;
             while(current!=null&&count<i){
                 current=current.next;
                 count++;
             }
             if(current!=null){
             tmp=current.next;
             current.next=null;
             current=tmp;
            }
            }
             ListNode sortedNode=merge(left,right);
             while(sortedNode!=null){
                   data.next=sortedNode;
                   sortedNode=sortedNode.next;
                   data=data.next;
              }
             
         }
     }
    return res.next;
    }
    public ListNode merge(ListNode left,ListNode right){
       ListNode head=new ListNode(0);
       ListNode current=head;
       while(left!=null&&right!=null){
           if(left.val<right.val){
               current.next=left;
               current=current.next;
               left=left.next;
           }else{
               current.next=right;
               current=current.next;
               right=right.next;
           }
       }
       if(left==null){
           current.next=right;
       }
       if(right==null){
           current.next=left;
       }
       return head.next;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值