力扣86——分隔链表

原题

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

原题url:https://leetcode-cn.com/problems/partition-list/

解题

题目很好理解,重点在于区分大于等于和小于目标值的节点,判断其实是很简单的,主要在于如何拼接链表,以及最终如何返回。

我发现,针对链表拼接的这种题目,常常可以通过添加辅助节点(辅助头结点或者辅助尾结点)来简化拼接操作。

这道题的话,需要针对两个区间都添加辅助头结点和尾结点,然后利用一个 current 节点进行遍历,扫描到大于等于目标值的节点,添加到相应区间的尾结点,再将尾结点后移;小于目标值的节点,添加到相应区间的尾结点,再将尾结点后移。

遍历完成后,利用辅助节点将两个区间拼接,再返回。让我们看下代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        if (head == null || head.next == null) {
            return head;
        }

        // 小于x的节点,开始节点和结束节点
        ListNode lessStart = new ListNode(0);
        ListNode lessEnd = lessStart;
        // 大于等于x的节点,开始节点和结束节点
        ListNode moreStart = new ListNode(0);
        ListNode moreEnd = moreStart;

                // 利用current节点扫描
        ListNode current = head;
        while (current != null) {
                        // 小于x的节点
            if (current.val < x) {
                                // 添加到相应区间的尾结点,再将尾结点后移
                lessEnd.next = current;
                lessEnd = current;
            }
                        // 大于等于x的节点
                        else {
                                // 添加到相应区间的尾结点,再将尾结点后移
                moreEnd.next = current;
                moreEnd = current;
            }

            current = current.next;
        }

                // 将两个区间拼接
        lessEnd.next = moreStart.next;
                // 需要让最终尾结点指向null,因为该尾结点不一定是原链表尾结点,如果指向别的节点,可能会造成循环链表
        moreEnd.next = null;
                // 返回现在的头结点
        return lessStart.next;
    }
}

提交OK,执行用时:1 ms,内存消耗:35.9 MB

总结

以上就是这道题目我的解答过程了,不知道大家是否理解了。正如上面所说,针对链接这样的题目,可以借用辅助节点,简化拼接过程,方便使用。

有兴趣的话可以访问我的博客或者关注我的公众号、头条号,说不定会有意外的惊喜。

https://death00.github.io/

公众号:健程之道

原文地址:https://www.cnblogs.com/death00/p/12114299.html

时间: 2024-10-06 14:29:53

力扣86——分隔链表的相关文章

leetcode 86. 分隔链表(Partition List)

目录 题目描述: 示例: 解法: 题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 解法: /** * Definition for singly-linked list. * struct ListNode { *

[LeetCode] 86. 分隔链表

题目链接 : https://leetcode-cn.com/problems/partition-list/ 题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 思路: 用两个链表,一个链表放小于x的节点,一个链表放大

力扣148——排序链表

原题 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 原题url:https://leetcode-cn.com/problems/sort-list/ 解决 题目很明确,排序,对于时间复杂度和空间复杂度有要求,针对O(n log n),

力扣142——环形链表 II

原题 给定一个链表,返回链表开始入环的第一个节点.?如果链表无环,则返回?null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 说明:不允许修改给定的链表. ? 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点. 示例?2: 输入:head = [1,2], p

力扣—Remove Duplicates from Sorted List(删除排序链表中的重复元素)python实现

题目描述: 中文: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2输出: 1->2 示例 2: 输入: 1->1->2->3->3输出: 1->2->3 英文: Given a sorted linked list, delete all duplicates such that each element appear only once. Example 1: Input: 1->1->

力扣算法题—042接雨水

1 #include"000库函数.h" 2 //一点头绪都没有 3 //然后就自己按自己的意思来一遍 4 //好像没有用算法 5 //16ms,让我激动一把 6 7 class Solution { 8 public: 9 int trap(vector<int>& height) { 10 if (height.size() < 2)return 0; 11 int s = 0;//起始点 12 int e = 0;//终止点 13 int v = 0;/

JS数据结构第六篇 --- 二叉树力扣练习题

1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {TreeNode} * 第一种方式迭代 * 执行用时 :72 ms, 在所有 JavaScript 提

力扣 — Rotate List()

题目描述: 中文: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL 示例 2: 输入: 0->1->2

回溯算法详解[力扣46:全排列]

解决一个回溯问题,实际上就是一个决策树的遍历过程.你只需要思考 3 个问题: 1.路径:也就是已经做出的选择. 2.选择列表:也就是你当前可以做的选择. 3.结束条件:也就是到达决策树底层,无法再做选择的条件. 如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象. 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表): if 满足结束条件: result