题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
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 if(head == null) { return null; } List<Integer> list = new ArrayList<>(); ListNode loop = head; while(loop != null) { list.add(loop.val); loop = loop.next; } ListNode loop2 = head; // list.sort(Comparator.comparingInt(v -> v)); // for(int i=0; i<list.size(); i++) { // loop2.val = list.get(i); // loop2 = loop2.next; // } Integer[] arr = list.toArray(new Integer[0]); // quickSort(arr, 0, arr.length-1); mergeSort(arr, 0, arr.length-1); for(int i=0; i<arr.length; i++) { loop2.val = arr[i]; loop2 = loop2.next; } return head; } public void mergeSort(Integer[] arr, int left, int right) { int diff = right - left; if(diff <= 0) { return; } if(diff == 1) { if(arr[left] > arr[right]) { Integer temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } return; } int middle = left + (right - left) / 2; mergeSort(arr, left, middle); mergeSort(arr, middle+1, right); List<Integer> list = new ArrayList<>(right - left + 1); Integer loopLeft = left; Integer loopRight = middle + 1; while(loopLeft <= middle) { int leftValue = arr[loopLeft]; while(loopRight <= right) { if(arr[loopRight] <= leftValue) { list.add(arr[loopRight]); loopRight++; } else { break; } } list.add(leftValue); loopLeft++; } int index = 0; for(Integer temp:list) { arr[left + index] = temp; index++; } } public void quickSort(Integer[] arr, int left, int right) { int keepLeft = left; int keepRight = right; if(left >= right) { return; } Integer base = arr[left]; Integer slot = left; while(left < right) { while(left < right) { if(arr[right] < base) { arr[slot] = arr[right]; slot = right; break; } right--; } while(left < right) { if(arr[left] > base) { arr[slot] = arr[left]; slot = left; break; } left++; } } arr[slot] = base; quickSort(arr, keepLeft, slot-1); quickSort(arr, slot+1, keepRight); } }