分割链表
概述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在大于或等于 x 的节点之前。你不需要保留每个分区中各节点的初始相对位置。
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
输入:head = [2,1], x = 2
输出:[1,2]
方法一:双链表
思路:首先定义两个空链表。然后循环原链表,进行判断。若 ≥ x 时,指向一个空链表。若 < x 时,指向另外一个空链表。最后把两个链表拼接,尾部指向空。
# 双链表
# 首先定义两个空链表。然后循环原链表,进行判断。
# 若 ≥ x 时,指向一个空链表。若 < x 时,指向另外一个空链表。
# 最后把两个链表拼接,尾部指向空。
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
sml_dummy, big_dummy = ListNode(0), ListNode(0)
sml, big = sml_dummy, big_dummy
while head:
if head.val < x:
sml.next = head
sml = sml.next
else:
big.next = head
big = big.next
head = head.next
sml.next = big_dummy.next
big.next = None
return sml_dummy.next
方法二:快慢指针
思路:该算法不需要额外的存储空间。思路也非常清晰。快指针指向 < x 的节点,慢指针用于存储即可。
# 快慢指针
# 该算法不需要额外的存储空间。思路也非常清晰。
# 快指针指向 < x 的节点,慢指针用于存储即可。
class Solution:
def partition(self, head: ListNode, x: int) -> ListNode:
fast, slow = head, head
while fast != None:
if fast.val < x:
temp = slow.val
slow.val = fast.val
fast.val = temp
slow = slow.next
fast = fast.next
else:
fast = fast.next
return head
总结
读题->纸上钻研->半小时过去->打开题解->看到路飞->眼中泛光->阅读题解->发出感叹->大佬!