分隔链表

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

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

示例:

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

解决思路:


从左向右遍历链表,将节点值小于x的节点交换至链表的前端,使用tag指向前端最后一个节点。

代码如下:

    public static ListNode partition(ListNode head, int x) {

        if (head==null || head.next==null) return head;

        ListNode h = new ListNode(0);
        h.next = head;

        ListNode temp;
        ListNode p = h;
        ListNode tag = h;
        while (p.next != null) {
            if (p.next.val < x) {
                if (tag == p) {
                    p = p.next;
                    tag = tag.next;
                }
                else {
                    temp = p.next;
                    p.next = temp.next;
                    temp.next = tag.next;
                    tag.next = temp;
                    tag = temp;
                }
            }
            else
                p = p.next;
        }
        return h.next;
    }

另一种方法是生成两个子链表,其中一个的节点值都小于x,另一个都大于等于x。

代码如下:

    public static ListNode test(ListNode head, int x) {

        ListNode h1 = new ListNode(0);
        ListNode l1 = h1;
        ListNode h2 = new ListNode(0);
        ListNode l2 = h2;

        while(head != null) {
            if (head.val < x) {
                l1.next = head;
                l1 = l1.next;
            }
            else {
                l2.next = head;
                l2 = l2.next;
            }
            head = head.next;
        }
        l2.next = null;
        l1.next = h2.next;
        return h1.next;
    }

原文地址:https://www.cnblogs.com/deltadeblog/p/9073856.html

时间: 2024-10-09 00:58:19

分隔链表的相关文章

【Leetcode】分隔链表

题目链接:分隔链表 题意:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 题解:QAQ刚开始看题目看错了.以为是那种排序.要按大小的.写了一堆错的.然后重新看题,发现简单了不少啊. 用两个链表分别放比x小的和比x大的,最后组合在一起就行了..只要求保留相对位置 代码: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode

086 Partition List 分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前.你应当保留两个分区中每个节点的初始相对位置.例如,给定1->4->3->2->5->2 和 x = 3, 返回1->2->2->4->3->5. 详见:https://leetcode.com/problems/partition-list/description/ /** * Definition for singly-linked list.

[Swift]LeetCode725. 分隔链表 | Split Linked List in Parts

Given a (singly) linked list with head node root, write a function to split the linked list into k consecutive linked list "parts". The length of each part should be as equal as possible: no two parts should have a size differing by more than 1.

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的节点,一个链表放大

LeetCode - 86、分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4->3->2->5->2, x = 3    输出: 1->2->2->4->3->5 1 /** 2 * 列表定义 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode

力扣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/ 解题 题目很好理解,重点在于区分大于等于和小于目标值的节点,判断

【LeetCode-链表】分隔链表

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

725 分隔链表

vector<ListNode *> splitListToParts(ListNode *root, int k) { vector<ListNode *> vec; if (root == nullptr) { for (; k > 0; --k) vec.push_back({}); return vec; } int len = 0; ListNode *it = root; for (; it != nullptr; it = it->next, ++len)