Skip to content

Latest commit

 

History

History
105 lines (73 loc) · 2.56 KB

86.分隔链表.md

File metadata and controls

105 lines (73 loc) · 2.56 KB

给你一个链表的头节点 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]

提示:

  • 链表中节点的数目在范围 [0, 200] 内

  • -100 <= Node.val <= 100

  • -200 <= x <= 200

解题思路

链表考什么?就是哨兵节点+虚拟节点+链表指针的移动

本题的解题思路:
维护两个链表small、big,分别存储比x小的,比x大的节点
但是有一个问题,维护这两个链表,但是无法获取两个链表的头指针,所以需要给两个链表两个哑节点(dummy node)
# 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: ListNode, x: int) -> ListNode:
        if not head:
            return head

        # 1.维护两个链表small、big,分别存储比x小的,比x大的节点
        small, big = ListNode(), ListNode()
        # 2.维护这两个链表,但是无法获取两个链表的头指针,所以需要给两个链表两个哑节点(dummy node)
        small_dummy_node = small
        big_dummy_node = big
        cur = head

        while cur:
            if cur.val < x:
                small.next = cur
                small = small.next
            else:
                big.next = cur
                big = big.next

            cur = cur.next

        # 3.small链表的最后一个节点的next指向big哑节点的next,即big链表的头节点
        small.next = big_dummy_node.next
        # 4.将big链表的最后一个节点的next置为None,
        # 这是因为当前节点复用的是原链表的节点,而其next可能指向一个小于x的节点,
        # 所以需要切断这个引用
        big.next = None

        return small_dummy_node.next


node_1 = ListNode(1)
node_4 = ListNode(4)
node_3 = ListNode(3)
node_2 = ListNode(2)
node_5 = ListNode(5)
node_2_bak = ListNode(2)
node_1.next = node_4
node_4.next = node_3
node_3.next = node_2
node_2.next = node_5
node_5.next = node_2_bak

s = Solution()
res = s.partition(node_1, 3)
while res:
    print(res.val)
    res = res.next