【python3】leetcode 86. Partition List (Medium)

 86. Partition List (Medium)

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

 

你可能感兴趣的:(leetcode,python)