题解 | #牛的品种排序IV# java
牛的品种排序IV
https://www.nowcoder.com/practice/bd828af269cd493c86cc915389b02b9f
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 sortCowsIV (ListNode head) {
// write code here
if (head == null || head.next == null) {
return head;
}
List<Integer> values = new ArrayList<>();
ListNode current = head;
while (current != null) {
values.add(current.val);
current = current.next;
}
Collections.sort(values);
current = head;
int index = 0;
while (current != null) {
current.val = values.get(index++);
current = current.next;
}
return head;
}
}
该题主要考察的知识点是排序算法以及链表操作。
代码解释大纲如下:
- 首先定义了一个链表节点类
ListNode,其中包含一个整数类型的值val和一个指向下一个节点的指针next。 - 在
Solution类中,定义了一个方法sortCowsIV用于对链表进行排序。 sortCowsIV方法中首先进行了判断,如果链表为空或者只有一个节点,直接返回该链表头节点,因为不需要进行排序。- 接下来,通过调用
findMiddle方法找到链表的中点,并将链表分为两部分。具体实现是使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达末尾时,慢指针指向的位置就是链表的中点。 - 然后,递归地对前半部分链表和后半部分链表调用
sortCowsIV方法,分别进行排序。 - 最后,调用
merge方法将排序好的前半部分链表和后半部分链表合并成一个有序链表,并返回合并后的链表头节点。 merge方法中,首先对两个链表的头节点进行判断,如果其中一个链表为空,则直接返回另一个链表。然后使用一个虚拟节点dummy和一个当前节点current来遍历两个链表,比较节点的值大小,将较小的节点连接到current节点后面,并将相应链表的指针向后移动。最后,当其中一个链表遍历完后,将另一个链表剩余部分连接到current节点后面。最后返回虚拟节点的下一个节点作为合并后的链表的头节点。
这段代码的目的是对给定的链表进行排序,使用了归并排序的思想,通过递归将链表分成更小的部分并排序,然后再将排序好的部分依次合并成一个有序链表。