![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d57180f676e44d3237aebc3a631bae91.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d79c508d534d157545adb37ed1ca32f2.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0d7b991f60ef3151614ec11c3d870b1c.png)
lc86.
- 思路是:先拆分,再拼接
- 具体操作:采用双指针p1,p2,不重新创建每个结点,而是改变结点的指向,归属于子链表1或者子链表2
- 遍历链表,依次判断结点大小,然后操作p1.next 或者 p2.next
- 因为可能需要操作头节点(头节点可能大于x),现有头结点具有不确定性,因此创建新的结点作头节点
- 子链表1和子链表2都需要创建头节点 before_head, after_head,并分别初始化 p1 和 p2
- 时间复杂度:O(n),遍历一次链表
- 空间复杂度:O(1),我们没有使用任何额外的空间,只是将原有的链表元素进行移动:将节点从原有链表中移除,并将它们添加到别的链表中
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
before_head = ListNode(-1)
after_head = ListNode(-1)
p1, p2 = before_head, after_head
while head:
if head.val < x:
p1.next = head
p1 = p1.next
else:
p2.next = head
p2 = p2.next
head = head.next
p1