题解 | #单链表的排序#

单链表的排序

http://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

时间超过97%,内存超过95%。

思路:遍历链表用ArrayList数组保存链表的数,然后对数组排序,选择快速排序实现,排序后再次遍历数组生成结果链表。

代码:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) {
        // write code here
        List<Integer> nums=new ArrayList<>();
        ListNode dummyHead=new ListNode(-1);//虚拟头结点
        while(head!=null){
            nums.add(head.val);
            head=head.next;
        }
        quickSort(nums,0,nums.size()-1);
        ListNode cur=dummyHead;
        for(int x:nums){
            ListNode temp=new ListNode(x);
            cur.next=temp;
            cur=cur.next;
        }
        return dummyHead.next;
    }
    private void quickSort(List<Integer> nums,int left,int right){
        if(left<right){
            int i=left,j=right;
            int temp=nums.get(i);//比较的基准值,一般取最左边的数
            while(i<j){
                while(i<j&&nums.get(j)>=temp){
                    j--;
                }
                if(i<j){
                    nums.set(i,nums.get(j));
                    i++;
                }
                while(i<j&&nums.get(i)<=temp){
                    i++;
                }
                if(i<j){
                    nums.set(j,nums.get(i));
                    j--;
                }
            }
            nums.set(i,temp);//将基准值放在中间位置,此时它的左边都小于它,右边都大于它
            quickSort(nums,left,i-1);
            quickSort(nums,i+1,right);
        }

    }
}
全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务