链表是算法中比较能考察逻辑和编码基本功的题型。这道题有意思的是题目描述很唬人,看着有点难度是mid,仔细分析实际上只能算easy。
给你一个链表的头节点 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]
题目描述的比较绕,其实只需要遍历一遍链表:把比给定x节点小的都放在前面,大于或者等于x节点的都放在后面,保持有来的相对位置不变。最后再把两截链表拼上即可。
public ListNode partition(ListNode head, int x) {
//定义两个链表
ListNode head1 = new ListNode(-1);
ListNode head2 = new ListNode(x);
//临时保存遍历过程中当前节点
ListNode tmp1 = head1, tmp2 = head2;
while (head != null) {
if (head.val < x) {
//把比给定x节点小的都放在前面
tmp1.next = head;
tmp1 = tmp1.next;
}else{
//大于或者等于x节点的都放在后面
tmp2.next = head;
tmp2 = tmp2.next;
}
head = head.next;
}
//一定要把这个链表尾部置空,因为可能已经链接到其它位置去。
tmp2.next = null;
//尾部tmp1和头部head2,前后两个链表拼接上
tmp1.next = head2.next;
return head1.next;
}
精彩的人生需要浪漫、无畏和勇气。