[路飞]_今夜分隔链表

221 阅读2分钟

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

86. 分隔链表

题目

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

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

示例1

image.png

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

解题思路:

首先想到的是分隔两个数组的方式解决这个问题;

思路1

枚举链表,将链表中的值存放在数组中,经过一遍枚举即可得到链表中的值;这里可以使用额外空间数组l1和l2;将链表中值大于x放在链表l1中;将小于x放在链表l2中;

在枚举l1数组元素得到链表list1

枚举l2数组元素得到链表list2;

将list.next指向list2;返回list链表表头即可

按照这个思路需要额外空间O(n);且不只是额外空间,本题考察链表知识点,使用数组不太符合本题题意;不能为了AC而刷题不是吗?

思路2

有了思路1,将不同的节点放入不同的数组思想,我觉得可以将不同的节点放在不同的链表中;

假设现在使用两个新两个新链表header和next;

枚举原链表

将小于x的节点按照链表按顺序存储到header

将大于x的节点按照链表按顺序存储到next

最后将header的下一指针指向next;将两个链表链接起来;返回header节点即可;

详细描述

假设有 header = new ListNode(0); next = new ListNode(0);

l1 = header l2 = next;

l1和l2可以理解为执行节点;他们指针指向链表的头节点; 当l1和l2在想后枚举的时候,不影响header和next的指向

最后将li.next指向next;返回header即可

解决链表类问题,一定要理解链表操作,比如指针指向,链表枚举,链表表头,指针等概念;

具体请看GIF图很代码; 代码参考GIF图更容易理解

通过keynode做了个动画,第一次做动画,有点惨不忍睹;虽然动画比较快,但是希望能帮助你;

111.gif

代码

var partition = function(head, x) {
    let header = new ListNode(-101);
    let next =  new ListNode(-101);
    let start = header
    let end = next

    while(head !== null){
        if(head.val >= x){
            end.next = head;
             head = head.next
            end = end.next;
            end.next= null;
        }else{
             start.next = head;
             head = head.next
             start=  start.next;
             start.next = null
        }

        
    }
    start.next = next.next
   
    return header.next
};

写在后面

理解了,怎么都能解决本题;不理解,看着云里雾里;不过没关系,谁又是天生什么都会的呢;努力吧,向宝拉姐学习;毕竟肩膀上扛的不是猪头哦