题解 | #牛的品种排序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
节点后面。最后返回虚拟节点的下一个节点作为合并后的链表的头节点。
这段代码的目的是对给定的链表进行排序,使用了归并排序的思想,通过递归将链表分成更小的部分并排序,然后再将排序好的部分依次合并成一个有序链表。