给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list
最开始以为x是位置,困惑了一下。后来通过报错发现x是值为x的节点。
笨想法是用list:
# 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 not head: #写不写都无所谓
return
res = []
while(head):
res.append(head.val)
head = head.next
dummy = ListNode(0) #装比x小的节点
dummy1 = ListNode(0) #装比x大的节点
cur = dummy
curr = dummy1
for i in res:
if i<x:
dummy.next = ListNode(i)
dummy = dummy.next
else:
dummy1.next = ListNode(i)
dummy1 = dummy1.next
dummy.next = curr.next
return cur.next
为了空间复杂度,省掉list :
# 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 not head: #可以不写
return
dummy = ListNode(0) #装小的
dummy1 = ListNode(0) #装大的
cur = dummy
curr = dummy1
while(head):
if head.val<x:
dummy.next = head
dummy = dummy.next
else:
dummy1.next = head
dummy1 = dummy1.next
head = head.next
dummy1.next=None #注意删大的最后的尾巴
dummy.next = curr.next
return cur.next
这个思路与上一个类似,把大的删点,连在dummy1上。dummy就只保留小的
# 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 not head:
return
dummy = ListNode(0) #装值小于x的节点
dummy1 = ListNode(0) #装值大于x的节点
cur = dummy
curr = dummy1
dummy.next = head
while(dummy.next):
if dummy.next.val>=x:
dummy1.next = dummy.next #先连接后删除
dummy.next = dummy.next.next
dummy1 = dummy1.next
else:
dummy = dummy.next
dummy1.next=None # 注意把最后大于x节点的尾巴删掉
dummy.next = curr.next
return cur.next