📜  门| GATE-CS-2002 |第 39 题(1)

📅  最后修改于: 2023-12-03 15:42:15.119000             🧑  作者: Mango

GATE-CS-2002 | 第 39 题

题目描述

给定链表的头指针和一个值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->
总结

这道题考察了对链表操作的基本技能,通过双指针的方法很好地将链表划分成了两部分,相信对程序员来说是一道不错的练习题。