Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
Example:
Input: head = 1->4->3->2->5->2, x = 3 Output: 1->2->2->4->3->5
1 two pointer
分less than x 和bigger than x俩部分,最后链接起来
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head or not head.next:return head
lesshead = lessnode = ListNode(0)
bighead = biggernode = ListNode(0)
node = head
while(head):
if head.val < x:
lessnode.next = head
lessnode = lessnode.next
else:
biggernode.next = head
biggernode = biggernode.next
head = head.next
biggernode.next = None
lessnode.next = bighead.next
return lesshead.next
2 List大法好 time O(n),space O(n)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head or not head.next:return head
left = []
right = []
node = head
while(node):
if node.val < x:left.append(node)
else:right.append(node)
node = node.next
for i in range(len(left)):
if i != len(left)-1:left[i].next = left[i+1]
elif i==len(left)-1 and right:
left[i].next = right[0]
else:left[i].next = None
for i in range(len(right)):
if i != len(right)-1:right[i].next = right[i+1]
else:right[i].next = None
if not left:return right[0]
else: return left[0]
2 deepcopy,slow
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head or not head.next:return head
newhead = ListNode(0)
lessnode = newhead
node = copy.deepcopy(head)
while(node):
if node.val < x:
lessnode.next = node
lessnode = lessnode.next
node = node.next
node = copy.deepcopy(head)
while(node):
if node.val >=x:
lessnode.next = node
lessnode = lessnode.next
node = node.next
lessnode.next = None
return newhead.next