题目链接:86.分隔链表
难度:中等

描述:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

提示:
节点数目:[0, 200]

题解

思路:
开始想用快慢指针。slow指向在最后一个小于x的节点,fast正常执行遍历,但发现当fast.val < x时,对fast节点的移动复杂度过高(要处理前面val > x的节点)。后来改变思路,维护两个链表,一个存放val < x的节点,另一个存放val >= x的节点,最后进行拼接。

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, val=0, next=None):
  4. # self.val = val
  5. # self.next = next
  6. class Solution:
  7. def partition(self, head: ListNode, x: int) -> ListNode:
  8. stx = ListNode() # smaller than x
  9. gtx = ListNode() # greater than x
  10. p, q = stx, gtx
  11. while head is not None:
  12. if head.val < x:
  13. p.next = head
  14. p = p.next
  15. else:
  16. q.next = head
  17. q = q.next
  18. head = head.next
  19. q.next = None # 开始没加这行会超出时间限制,按理说是不影响逻辑的。。。
  20. p.next = gtx.next
  21. return stx.next