目录
题目来源:
题目描述:
初始代码:
思路:
具体做法:
我的代码:
优化代码:
对比:
复习:List
基本介绍
常用方法
遍历方式
题目来源:
单链表的排序_牛客题霸_牛客网 (nowcoder.com)
题目描述:
给定一个节点数为n的无序单链表,对其按升序排序

初始代码:
import java.util.*;
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) {
        // write code here
    }
}思路:
将链表转换为数组进行排序
具体做法:
- 遍历链表,将节点值加入数组
- 使用内置排序函数对数组进行排序
- 创建一个新的链表头节点
- 依次遍历数组,创建节点,将数组值赋值给新创建的节点
我的代码:
import java.util.*;
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) {
        // write code here
        ArrayList<Integer> tmp = new ArrayList();
        while (head != null) {
            tmp.add(head.val);
            head = head.next;
        }
        tmp.sort(new Comparator<Integer>() {
            public int compare(Integer x1, Integer x2) {
                return x1 - x2;
            }
        });
        ListNode head2 = new ListNode(0);
        ListNode p = head2;
        for (int x : tmp ) {
            p.next = new ListNode(x);
            p = p.next;
        }
        return head2.next;
    }
}
优化代码:
官方题解
import java.util.*;
public class Solution {
    public ListNode sortInList (ListNode head) {
        ArrayList<Integer> nums = new ArrayList(); 
        ListNode p = head;
        //遍历链表,将节点值加入数组
        while(p != null){ 
            nums.add(p.val);
            p = p.next;
        }
        p = head;
        //对数组元素排序
        Collections.sort(nums); 
        //遍历数组
        for(int i = 0; i < nums.size(); i++){ 
            //将数组元素依次加入链表
            p.val = nums.get(i); 
            p = p.next;
        }
        return head;
    }
}
对比:
- 在sort()部分更简洁, 使用Collections的sort无需重写Comparator
- 将原链表中的节点值修改为排序后的数组值,更省时间、空间
复习:List
基本介绍
- LIst接口是Collection接口的子接口 
- List集合类中元素有序(即添加顺序和取出顺序一致)且可重复
- List结合中的每个元素都有其对应的顺序索引
- List容器可以根据序号存取容器中的元素
常用方法
| 方法 | 功能 | 
| void add(int index, Object ele) | 在index位置插入ele元素 | 
| boolean addAll(int index, Collection eles) | 从index位置开始将eles中的所有元素添加进来 | 
| Object get(int index) | 获取指定index位置的元素 | 
| int indexOf(Object obj) | 返回首次obj在集合中首次出现的位置 | 
| int lastIndexOf(Object obj) | 返回obj在当前集合末次出现的位置 | 
| Object remove(int index) | 设置指定index位置的元素ele | 
| Object set(int index, Object ele) | 设置指定index位置的元素为ele | 
| List subList(int fromIndex, int toIndex) | 返回从fromIndex到toIndex位置的子集合 | 
遍历方式
- iterator Iterator iter = col.iterator(); while(iter.hasNext()){ Object o=iter.next(); } 
-  增强for for(Object o:col){} 
-   普通for 



















