📜  排序包含从1到N的值的链接列表(1)

📅  最后修改于: 2023-12-03 14:54:42.367000             🧑  作者: Mango

排序包含从1到N的值的链接列表介绍

当处理包含从1到N的值的链接列表时,我们通常需要将其进行排序以方便查找或者展示。下面介绍一些处理排序包含从1到N的值的链接列表的方法。

方法一:使用数组

我们可以创建一个长度为N的数组,将对应的值放在相应的数组下标位置上,再遍历数组输出排序后的结果。这种方法时间复杂度为O(N),空间复杂度也为O(N)。

num_list = [1, 3, 2, 5, 4]
sorted_list = [0] * len(num_list)

for num in num_list:
    sorted_list[num - 1] = num

print(sorted_list)

输出结果为:[1, 2, 3, 4, 5]

方法二:使用集合

我们也可以使用集合来存储数据,然后再将集合转成列表并排序。这种方法时间复杂度为O(NlogN),空间复杂度为O(N)。

num_list = [1, 3, 2, 5, 4]
num_set = set(num_list)
sorted_list = sorted(num_set)

print(sorted_list)

输出结果为:[1, 2, 3, 4, 5]

方法三:原地排序

如果我们不想使用额外的空间,可以将原链表进行原地排序。这种方法时间复杂度为O(NlogN),空间复杂度为O(1)。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def sort_list(head):
    if not head or not head.next:
        return head

    slow, fast = head, head.next
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    mid, slow.next = slow.next, None
    left, right = sort_list(head), sort_list(mid)

    dummy = cur = ListNode(0)
    while left and right:
        if left.val < right.val:
            cur.next, left = left, left.next
        else:
            cur.next, right = right, right.next
        cur = cur.next

    cur.next = left if left else right

    return dummy.next

num_list = [1, 3, 2, 5, 4]

head = ListNode(num_list[0])
cur = head
for num in num_list[1:]:
    cur.next = ListNode(num)
    cur = cur.next

sorted_list = []
cur = sort_list(head)
while cur:
    sorted_list.append(cur.val)
    cur = cur.next

print(sorted_list)

输出结果为:[1, 2, 3, 4, 5]

以上介绍了三种处理排序包含从1到N的值的链接列表的方法,根据实际需求选择合适的方法即可。