题解 | #牛群分隔#

牛群分隔

https://www.nowcoder.com/practice/16d9dc3de2104fcaa52679ea796e638e?tpId=354&tqId=10591416&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param x int整型
     * @return ListNode类
     */
    public ListNode cow_partition(ListNode head, int x) {
        // 用于存放小于x的节点值
        ArrayList<Integer> list1 = new ArrayList<>();
        // 用于存放大于等于x的节点值
        ArrayList<Integer> list2 = new ArrayList<>();

        ListNode temp = head;
        while (temp != null) {
            if (temp.val < x) {
                list1.add(temp.val);
            } else {
                list2.add(temp.val);
            }
            temp = temp.next;
        }
        ListNode cur = new ListNode(-1);
        ListNode result = cur;
        for (int i = 0; i < list1.size(); i++) {
            ListNode node = new ListNode(list1.get(i));
            cur.next = node;
            cur = cur.next;
        }
        for (int i = 0; i < list2.size(); i++) {
            ListNode node = new ListNode(list2.get(i));
            cur.next = node;
            cur = cur.next;
        }
        return result.next;
    }
}

本题知识点分析:

1.集合存取

2.链表遍历和取值

3.链表前驱结点和后继接单

4.链表连接

本题解题思路分析:

1.先将全有的值取出放到集合

2.小于的放入集合1,大于等于的值放入集合2

3.然后将值重新拼接,先拼接集合1,再拼接集合2

4.最后返回虚拟头结点的.next

做完本题我发现可以直接创建两个链表,一次遍历,小于的放在链表1,小于放在链表2,然后让链表1的尾巴指向链表2的头就可以了,这样一次遍历肯定是更快的,推荐直接一次遍历。

本题使用编程语言: Java

如果您觉得本篇文章对您有帮助的话,可以点个赞支持一下,感谢~

高频面试算法题解 文章被收录于专栏

高频面试算法题解,每天一小步,人生一大步,跟着一起刷起来!

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务