Leetcode-每日一题【86.分隔链表】

该文章介绍了一种使用哨兵方法解决链表分隔问题的策略。通过创建两个链表,一个用于存储大于或等于x的节点,另一个存储小于x的节点,然后在遍历过程中根据节点值将其放入相应链表。最后,将两个链表拼接起来,确保原始相对顺序不变。
摘要由CSDN通过智能技术生成

题目

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

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

示例 1:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200] 内
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

解题思路

1.我们可以用哨兵的思想来解决这个问题,首先我们设置一个存放大于 x 的链表 big 和一个存放小于 x 的链表 small,并设置一个 big 的头指针 bighead 和一个 small 的头指针 smallhead ,以及我们的哨兵 cur 指针

2.我们让 cur 指针指向表头,开始进行遍历,并且与 x 进行比较,若大于等于 x 则放入big链表,若小于 x 则放入 small 链表,

3.遍历结束后,我们将 big 链表连接在 small 链表之后,并将 big.next 置为 null,否则会出现环。 

代码实现

class Solution {
    public ListNode partition(ListNode head, int x) {
        if(head == null){
            return head;
        }
        ListNode big = new ListNode(0);
        ListNode small = new ListNode(0);
        ListNode bighead = big;
        ListNode smallhead = small;
        ListNode cur = head;
        while(cur != null){
            if(cur.val >= x){
                big.next = cur;
                big = big.next;
            }else{
                small.next = cur;
                small = small.next;
            }
            cur = cur.next;
        }
        small.next = bighead.next;
        big.next = null;
        return smallhead.next;
        

    }
}

测试结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值