[路飞]_leetcode-86-分隔链表

简介: leetcode-86-分隔链表

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


给你一个链表的头节点 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 进行分区


最后将分区后存储大于等于 x 的节点的链表连接到存储小于 x 的链表的后边


最后返回结果链表即可


完成解题思路如下:


  1. 特殊判断链表为空或者只有一个节点,直接返回原链表
  2. 创建 smallHead 虚拟头节点存储值小于 x 的节点组成的链表
  3. 创建 bigHead 虚拟头节点存储值大于等于 x 的节点组成的链表
  4. 遍历输入两边,判断当前节点的值是否小于 x,如果成立,则将该节点连接到 smallHead 链表的末尾,反之连接到 bigHead 链表的末尾
  5. bigHead 链表末尾节点的 next 指针指向 null,防止结果链表成环
  6. bigHead 链表连接到 smallHead 链表的末尾
  7. 返回 smallHead.next 即可


整体过程如下:


网络异常,图片无法展示
|


代码如下:


var partition = function(head, x) {
  // 特判链表为空或者只有一个节点,直接返回
  if(head === null || head.next === null) return head;
  // 创建虚拟头节点,存储小于X的节点组成的链表
  const smallHead = new ListNode(0),
  // 创建虚拟头节点,存储不小于X的节点组成的链表
  bigHead = new ListNode(0);
  let smallTail = smallHead,
  bigTail = bigHead,
  cur = head;
  // 遍历链表
  while(cur){
    // 如果该节点值小于X,将它连接到较小链表的末尾
    if(cur.val<x){
      smallTail.next = cur;
      smallTail = smallTail.next;
    }else{
      // 反之连接到较大链表的末尾
      bigTail.next = cur;
      bigTail = bigTail.next;
    }
    cur = cur.next;
  }
  // 将较大链表末尾节点 next 指向 null,防止结果链表成环
  bigTail.next = null;
  // 将较大链表连接到较小链表的后面
  smallTail.next = bigHead.next;
  // 返回较小链表虚拟头节点的 next
  return smallHead.next;
};
复制代码


至此我们就完成了 leetcode-86-分隔链表


如有任何问题或建议,欢迎留言讨论!

相关文章
|
3月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
41 1
|
3月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
56 0
Leetcode第21题(合并两个有序链表)
|
3月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
30 0
LeetCode第二十四题(两两交换链表中的节点)
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
48 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
3月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
106 0
|
8月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
7月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
66 2
|
8月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
76 1