本题考察链表排序的相关知识点。
解题思路:遍历链表,逐个取值后去加入到新链表中(需要重新new节点),不能改变原先的链表结构,不然遍历顺序就乱了。
整体的过程如下所示
注意35行在内部寻找位置的遍历中控制一下循环条件
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode sortList (ListNode head) { // write code here if(head==null||head.next==null) return head; ListNode maxNode = new ListNode(-1), node = head, maxHead = maxNode; while(node!=null){ if(node.val>=maxNode.val){ // 新的最大节点 maxNode.next = new ListNode(node.val); maxNode = maxNode.next; }else{ // 中间节点 ListNode temp = maxHead; ListNode pre = new ListNode(-1); pre.next = temp; while(temp.val<node.val&&temp.next!=null){ //寻找位置 pre = pre.next; temp = temp.next; } //跳出循环的时候 temp刚好是第一个大于当前node的节点 //pre代表前一个节点 也就是此时node的插入位置前后节点找到了 ListNode newNode = new ListNode(node.val); pre.next = newNode; newNode.next = temp; } node = node.next; //node只管往后遍历 } return maxHead.next; } }