题解 | #牛的品种排序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;
    }
}

该题主要考察的知识点是排序算法以及链表操作。

代码解释大纲如下:

  1. 首先定义了一个链表节点类 ListNode,其中包含一个整数类型的值 val 和一个指向下一个节点的指针 next
  2. 在 Solution 类中,定义了一个方法 sortCowsIV 用于对链表进行排序。
  3. sortCowsIV 方法中首先进行了判断,如果链表为空或者只有一个节点,直接返回该链表头节点,因为不需要进行排序。
  4. 接下来,通过调用 findMiddle 方法找到链表的中点,并将链表分为两部分。具体实现是使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达末尾时,慢指针指向的位置就是链表的中点。
  5. 然后,递归地对前半部分链表和后半部分链表调用 sortCowsIV 方法,分别进行排序。
  6. 最后,调用 merge 方法将排序好的前半部分链表和后半部分链表合并成一个有序链表,并返回合并后的链表头节点。
  7. merge 方法中,首先对两个链表的头节点进行判断,如果其中一个链表为空,则直接返回另一个链表。然后使用一个虚拟节点 dummy 和一个当前节点 current 来遍历两个链表,比较节点的值大小,将较小的节点连接到 current 节点后面,并将相应链表的指针向后移动。最后,当其中一个链表遍历完后,将另一个链表剩余部分连接到 current 节点后面。最后返回虚拟节点的下一个节点作为合并后的链表的头节点。

这段代码的目的是对给定的链表进行排序,使用了归并排序的思想,通过递归将链表分成更小的部分并排序,然后再将排序好的部分依次合并成一个有序链表。

全部评论

相关推荐

点赞 评论 收藏
分享
06-18 15:03
重庆大学 运营
运营你豪哥:做一下被打的数据,分析输出优化建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务