📅  最后修改于: 2023-12-03 15:42:15.119000             🧑  作者: Mango
给定链表的头指针和一个值x,将链表划分成两部分,使得小于x的值排在大于等于x的值之前。链表也可能不完整。
例如,如果给定1->3->2->4->5->2和x = 3,则返回1->2->2->3->4->5。
这道题可以采用双指针的方法。用一个指针before来遍历链表,找到第一个大于等于x的节点,用另一个指针after来依次遍历before后面的节点,将小于x的节点插入到before节点后面。最后返回链表的头节点即可。
下面是代码实现:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def partition(head, x):
before_head = before = ListNode(0)
after_head = after = ListNode(0)
while head:
if head.val < x:
before.next = head
before = before.next
else:
after.next = head
after = after.next
head = head.next
after.next = None
before.next = after_head.next
return before_head.next
由于只需要遍历一次原链表,因此时间复杂度为O(n)。
新建了两个链表节点,因此空间复杂度为O(1)。
我们可以针对题目中的例子进行测试,以确保代码的正确性。
例如,测试以下代码:
head = ListNode(1)
head.next = ListNode(3)
head.next.next = ListNode(2)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
head.next.next.next.next.next = ListNode(2)
new_head = partition(head, 3)
while new_head:
print(new_head.val, end="->")
new_head = new_head.next
# 输出: 1->2->2->3->4->5->
这道题考察了对链表操作的基本技能,通过双指针的方法很好地将链表划分成了两部分,相信对程序员来说是一道不错的练习题。