目录
题目来源:
题目描述:
初始代码:
思路:
具体做法:
我的代码:
优化代码:
对比:
复习: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