题目:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:

输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5] 示例 2: 输入:head = [2,1], x = 2 输出:[1,2]
思路如下:
在合并两个有序链表时,思想是将两个链表合二为一。但这道题需要把原链表一分为二,即需要创建两个空链表,并分别按条件存放原链表。其中一个链表的元素都 小于x ,另一个链表的元素都 大于等于x 。最后把这两条链表连接起来,就能得到题目要求的新链表。
题解如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
dummy1 = ListNode(-1) # 保存小于x的节点
dummy2 = ListNode(-1) # 保存大于等于x的节点
p1, p2 = dummy1, dummy2 # p1和p2分别指向两个子链表的末尾
current = head # 当前遍历的节点
while current:
if current.val < x:
p1.next = current # 将当前节点连接到dummy1链表
p1 = p1.next # 移动p1指针到新节点
else:
p2.next = current # 将当前节点连接到dummy2链表
p2 = p2.next # 移动p2指针到新节点
current = current.next # 移动到原链表的下一个节点
# 拼接两个子链表:dummy1的末尾连接到dummy2的起始节点
p1.next = dummy2.next
# 确保dummy2的末尾正确指向null(防止原链表末尾残留指针)
p2.next = None
return dummy1.next # 返回合并后的链表头节点
代码解释:
-
创建两个虚拟节点 :
-
dummy1和dummy2是两个虚拟节点,用于标记子链表的起始位置。 -
p1和p2初始时指向这两个新节点,方便后续操作。
-
-
遍历原链表 :
-
对于每个节点
current -
如果值小于
x,则将其连接到dummy1的末尾(p1.next = current),并移动p1指针。 -
否则,连接到
dummy2的末尾(p2.next = current),并移动p2指针。
-
-
拼接链表 :
-
遍历结束后,
p1指向dummy1子链表的末尾,将其指向dummy2子链表的起始节点(dummy2.next)。 -
p2此时指向dummy2子链表的末尾,需将其next置为null,避免形成环。
-
&spm=1001.2101.3001.5002&articleId=146444126&d=1&t=3&u=1f76545c3bcf4ea785e3283e8ddb1eae)
478

被折叠的 条评论
为什么被折叠?



