「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
题目
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例1
输入: 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做了个动画,第一次做动画,有点惨不忍睹;虽然动画比较快,但是希望能帮助你;
图
代码
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
};
写在后面
理解了,怎么都能解决本题;不理解,看着云里雾里;不过没关系,谁又是天生什么都会的呢;努力吧,向宝拉姐学习;毕竟肩膀上扛的不是猪头哦