分割链表
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
java
解题思路:
总结题目,只需要把小于x的数拿到最前方,其他的不做要求,所以创建p,q来帮助我们实现,q用来遍历链表,发现小于x的数就和p交换,因为一开始p是在最前方,所以变相的等于把值拿到最前方了,每交换一次就p=p.next
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode p = head;
ListNode q = head;
while(q!=null){
if(q.val<x){
int tmp = p.val;
p.val = q.val;
q.val = tmp;
p = p.next;
}
q = q.next;
}
return head;
}
}
python
解题思路:
遍历三次分别拿到大于x,等于x,小于x的值,之后遍历依次赋给链表
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
res = []
p = head
p_max = head
p_D = head
p_min = head
while p_max :
if p_max.val>x:
res.append(p_max.val)
p_max = p_max.next
while p_D :
if p_D.val==x:
res.append(p_D.val)
p_D = p_D.next
while p_min :
if p_min.val<x:
res.append(p_min.val)
p_min = p_min.next
while p:
p.val =res.pop()
p = p.next
return head