题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置
示例
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例2:
输入:head = [2,1], x = 2
输出:[1,2]
思路
用两个指针
p
1
p1
p1,
p
2
p2
p2,当所在节点的值小于
x
x
x的时候,两个指针都移动,当节点的值开始大于或等于
x
x
x的时候,
p
2
p2
p2指针移动,
p
1
p1
p1不动。直到
p
2
p2
p2遇到小于
x
x
x的时候,开始替换。
由于题目要求保留顺序不变,我们需要记录
p
1
p1
p1和
p
2
p2
p2之间的距离,一个一个做替换。
代码
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head: return
p1 = head
p2 = head
count = 0
while p2.next:
if p1.val < x:
p1 = p1.next
p2 = p2.next
else:
count += 1
p2 = p2.next
if p2.val < x and p2 != p1:
temp = p1.val
p1.val = p2.val
st = p1.next
for i in range(count):
temp2 = st.val
st.val = temp
temp = temp2
st = st.next
return head