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