86. 分隔链表
86. 分隔链表
题意
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。并且需要保留两个分区中每个节点的初始相对位置。
解题思路
用两个数组分别把小于和大于的都保存下来,然后依照顺序来创建链表;
在原来的链表的基础上操作;
创建新的结点;
实现
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head:
return None
small, big = [], []
node = head
while node:
if node.val < x:
small.append(node.val)
else:
big.append(node.val)
node = node.next
new_link = ListNode(0)
node = new_link
for n in small:
node.next = ListNode(n)
node = node.next
for n in big:
node.next = ListNode(n)
node = node.next
return new_link.next
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
# h1为小,h2为大
h1, h2 = ListNode(0), ListNode(0)
h2.next = head
p1, p2 = h1, h2
while p2 and p2.next:
if p2.next.val < x:
p1.next = p2.next
p1 = p1.next
p2.next = p2.next.next # 删除
else:
p2 = p2.next
# 剩下的都是比x大的
p1.next = h2.next
return h1.next
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
# h1为小,h2为大
h1, h2 = ListNode(0), ListNode(0)
p1, p2 = h1, h2
while head:
if head.val < x:
p1.next = ListNode(head.val)
p1 = p1.next
else:
p2.next = ListNode(head.val)
p2 = p2.next
head = head.next
p1.next = h2.next
return h1.next
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法