📅  最后修改于: 2023-12-03 15:10:15.299000             🧑  作者: Mango
这是一道在 UGC NET CS 2016 年 7 月 – III 中出现的题目,主要考查数据结构和算法方面的知识。以下是问题的描述:
在一个链表中,每个节点包含一个整数和指向下一个节点的指针。现在需要将链表中的节点按照其值进行排序,并返回排序后的链表。要求时间复杂度为 O(n log n),空间复杂度为 O(1)。
对于程序开发人员,这道题需要熟练掌握链表的基本操作,对排序算法有一定的了解,能够分析算法的时间复杂度和空间复杂度。以下是一个 C++ 的解决方案:
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head || !head->next) return head;
ListNode *slow = head, *fast = head;
while(fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next;
slow->next = nullptr;
return merge(sortList(head), sortList(fast));
}
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode dummy(0), *tail = &dummy;
while(l1 && l2) {
if(l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
if(l1) tail->next = l1;
if(l2) tail->next = l2;
return dummy.next;
}
};
这段代码定义了一个 ListNode
结构体,表示链表中的节点,包含一个整数值和指向下一个节点的指针。同时还定义了一个名叫 Solution
的类,其中包含 sortList
和 merge
两个函数。
sortList
函数是这个算法的主体部分,采用了分治的思想,先将链表分成两个部分,然后递归调用自己对这两个部分进行排序,并使用 merge
函数将这两个部分合并。merge
函数则是合并两个链表的普通写法,将两个链表的节点逐一比较,将较小的节点加入到新链表中。
这个算法的时间复杂度为 O(n log n),空间复杂度为 O(1)。在使用这个算法进行链表排序时,开发人员需要注意处理边界条件,例如判断链表是否为空或者链表中只有一个节点等情况。