题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5
思路一:
标志节点mark指向链表中第一个节点next值大于等于x的节点。后面链表节点值小于x的节点需要插入到mark节点之后。
代码一:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
if head == None or head.next == None:
return head
head1 = ListNode(0)
head1.next = head
mark = head1
while mark.next and mark.next.val<x:
mark = mark.next
if mark.next == None:
return head1.next
if mark.next.next:
pre = mark.next
cur = mark.next.next
nex = cur.next
while cur:
while cur and cur.val>=x:
pre = pre.next
cur = cur.next
if nex == None:
return head1.next
nex = cur.next
cur.next = mark.next
mark.next = cur
pre.next = nex
mark = cur
cur = nex
if nex == None:
return head1.next
else:
nex = nex.next
else:
return head1.next
return head1.next
思路二:
定义两个头结点,一个存储值小于x值的节点,一个存储值大于x值的节点。最后让lesshead的尾节点指向morehead的头结点即可。
代码二:
# 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
"""
if not head or not head.next:
return head
cur = head
lesshead,morehead = ListNode(0),ListNode(0)
p,q = lesshead,morehead
while cur:
if cur.val<x:
p.next = cur
p = p.next
else:
q.next = cur
q = q.next
cur = cur.next
p.next = morehead.next
q.next = None
return lesshead.next