leetcode编程leetcode86.分隔链表
univerexplorer86. 分隔链表
中等(链表)
给你一个链表的头节点 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]
代码一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Solution: def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]: if not head: return head root = ListNode(0) root.next = head pre = root cur = head flag = False temp = temp1 = ListNode(0) while cur: if cur.val >= x and not flag: pre1 = pre cur1 = cur flag = True if cur.val < x and flag: temp.next = ListNode(cur.val) temp = temp.next pre.next = cur.next cur = cur.next continue pre = pre.next cur = cur.next if temp1.next: pre1.next = temp1.next temp.next = cur1 return root.next
|
思路:
大体思路是:将第一个大于等于x值的节点后面的所有小于x值的节点存到一个新链表中,原链表中的这些节点都删除,将新链表插入到第一个大于等于x值的节点之前。
代码二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Solution: def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]: if not head: return head s = ListNode(0) s1 = s l = ListNode(0) l1 = l while head: if head.val < x: s1.next = ListNode(head.val) s1 = s1.next head = head.next continue l1.next = ListNode(head.val) l1 = l1.next head = head.next s1.next = l.next return s.next
|
思路:
大小节点存放到不同的两个链表,思路更简单一些,但是效率低了一些,空间复杂度更高。