Partition List
Given a linked list and a valuex, partition it such that all nodes less thanxcome before nodes greater than or equal tox.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given1->4->3->2->5->2
andx=
3,
return1->2->2->4->3->5
.
链表都是麻烦的东西。
一定要学会分情况分析。一开始我是想到在原链表直接操作。
后来想想还是觉得新建一个链表存储小值或者大于等于的值,最后合并两个链表,会比较简单。然后到网上查找一下,发现几乎全部是这种做法。
我原来的想法写写如何做的吧。
在原链表操作就是分为三段:
第一段:小值;
第二段:大于等于的值;
第三段:是还没有处理完的值。
但是有3个情况:1 可能开始的时候全部小值, 2 可能开始的时候全部是大值 3 分了三段的情况(神奇的是,这也是我写博客的时候才搞清楚的,突然觉得思路从没有那么清楚过!于是重新修改代码,果然更加简洁了)
当遇到大值的时候我们只需要往前搜索,不需做其他操作
当遇到小值的时候就分三种情况,如上,处理。
突然觉得这样分析就很科学很清晰了。看来科学地系统地分析真的很重要。
我开始用画图,给每个node赋值分情况分析,虽然这个方法也很好,但是总归要上升到科学系统分析更重要。
下面还有有趣的事情就是Java和C++的操作链表的效率问题,基本上差不多的算法,运行效率居然差别那么多,有图有真相:
看到了吧,找了好几个算法对比也如此。我这里的算法最快了48ms,呵呵。运行几次都没超48ms。
ListNode *partition(ListNode *head, int x)
{
if (!head || !head->next)
{
return head;
}
ListNode *lessP = head;
ListNode *larEquP = head;
ListNode *cur = head->next;
//注意:引发无限循环
while (cur)
{
if (cur->val < x)
{
//1全部是小值的时候
if(larEquP->val < x)
{
cur = cur->next;
lessP = lessP->next;
larEquP = larEquP->next;
}
//2全部是大值的时候
else if(head->val >= x)
{
larEquP ->next = cur->next;
cur->next = head;
head = cur;
cur = larEquP->next;
lessP = head;
}
//3分了三段值的情况 - 插入lessP后面
else
{
larEquP->next = cur->next;
cur->next = lessP->next;
lessP->next = cur;
lessP = cur;
cur = larEquP->next;
}
}
//大值不用动
else if (cur->val >= x)
{
larEquP = larEquP->next;
cur = cur->next;
}
}
return head;
}
看见链表要活用dummy节点,使得程序可以很简洁。
//2014-2-14 update
ListNode *partition(ListNode *head, int x)
{
ListNode dum1(0);
ListNode dum2(0);
ListNode *p1 = &dum1;
ListNode *p2 = &dum2;
while (head)
{
if (head->val < x)
{
p1->next = head;
p1 = p1->next;
}
else
{
p2->next = head;
p2 = p2->next;
}
head = head->next;
}
p1->next = dum2.next;
p2->next = nullptr; //注意清空结尾之后的数据。
return dum1.next;
}
分享到:
相关推荐
python python_leetcode面试题解之两两交换链表中的节点
c++ c++_c++编程基础之leetcode题解第61题旋转链表
c语言 c语言_c语言编程基础之leetcode题解第19题删除链表的倒数第N个结点
c++ c++_c++编程基础之leetcode题解第19题删除链表的倒数第N个结点
# 删除链表的倒数第N个节点 题目链接给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和
换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。示例 1:输出:Reference of the nod
面试题 02.07. 链表相交原题链接:面试题 02.07. 链表相交解法一:首尾相接法解题思路将这两个链表首尾相连,然后检测这个链表是否存在环,如果存在,则两
示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4示例2:输入: -1->5->3->4->0输出: -1->0->3->4-
leetcode-链表笔记
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.ListNode dummy =
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。Related Topics链表题目代码* Definition for singly-link
示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3链接:https://leetcode-cn.
示例 1:解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL示例 2:解释:向右旋转 1
示例 1:输入: 1->2示例 2:输入: 1->2->2->1进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?Related Topic
LeetCode 206的题目是“反转链表”(Reverse Linked List),它要求将一个单链表的所有节点反转,并返回反转后链表的头节点。这是一个基础但非常重要的链表操作问题,它不仅考察了对链表数据结构的理解,还涉及到了...
LeetCode 203的题目是“移除链表元素”,要求从一个链表中删除所有值等于给定值val的节点,并返回新链表的头节点。这个问题考验的是对链表数据结构的理解和操作能力,包括如何遍历链表、如何处理边界条件(如头节点...
python python_leetcode面试题解之删除链表的倒数第N个节点
leetcode思维导图-链表
LeetCode 141 环形链表讲解 PPT