• leetcode做题笔记148. 排序链表


    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

    思路一:归并排序

    c语言解法

    1. struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {
    2. struct ListNode* dummyHead = malloc(sizeof(struct ListNode));
    3. dummyHead->val = 0;
    4. struct ListNode *temp = dummyHead, *temp1 = head1, *temp2 = head2;
    5. while (temp1 != NULL && temp2 != NULL) {
    6. if (temp1->val <= temp2->val) {
    7. temp->next = temp1;
    8. temp1 = temp1->next;
    9. } else {
    10. temp->next = temp2;
    11. temp2 = temp2->next;
    12. }
    13. temp = temp->next;
    14. }
    15. if (temp1 != NULL) {
    16. temp->next = temp1;
    17. } else if (temp2 != NULL) {
    18. temp->next = temp2;
    19. }
    20. return dummyHead->next;
    21. }
    22. struct ListNode* toSortList(struct ListNode* head, struct ListNode* tail) {
    23. if (head == NULL) {
    24. return head;
    25. }
    26. if (head->next == tail) {
    27. head->next = NULL;
    28. return head;
    29. }
    30. struct ListNode *slow = head, *fast = head;
    31. while (fast != tail) {
    32. slow = slow->next;
    33. fast = fast->next;
    34. if (fast != tail) {
    35. fast = fast->next;
    36. }
    37. }
    38. struct ListNode* mid = slow;
    39. return merge(toSortList(head, mid), toSortList(mid, tail));
    40. }
    41. struct ListNode* sortList(struct ListNode* head) {
    42. return toSortList(head, NULL);
    43. }

    分析:

    本题要将链表排序,由于链表的特性,无法直接从中间进行修改,所以利用快慢指针将链表分为两部分,对两个子链表进行排序,通过递归不断将链表分为两部分,直到无法分为止,最后合并所有的链表,得到排序后的链表

    思路二:转换为数组后进行排序再转换为链表

    c语言解法(此解法有取巧的成分,但时间复杂度上优于思路一,故列出)

    1. int cmp(const int* a,const int* b)
    2. {
    3. return *(int*)a - *(int*)b;
    4. }
    5. struct ListNode* sortList(struct ListNode* head)
    6. {
    7. int A[50000]={0};
    8. int i = 0;
    9. struct ListNode* tmp = head;
    10. for(i=0; tmp != NULL; i++)
    11. {
    12. A[i] = tmp->val;
    13. tmp = tmp->next;
    14. }
    15. qsort(A,i,sizeof(int),cmp);
    16. tmp = head;
    17. for(i=0; tmp != NULL;i++)
    18. {
    19. tmp->val = A[i];
    20. tmp = tmp->next;
    21. }
    22. return head;
    23. }

    分析:

    第二种思路则是将原链表转换为数组后进行排序再转换为链表,此解法更加直观,同时数组排序更加熟悉,此处利用快速排序排序数组,最后返回排序好的链表即可解决

    总结:

    本题考察对链表的排序操作,利用归并排序即可解决,也可转换为数组后利用数组的方法解决。

  • 相关阅读:
    css 流式布局
    拓扑结构+差分约束+SLF最长路+扩欧
    DN-DETR: Accelerate DETR Training by Introducing Query DeNoising
    iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?
    Mybatis-plus 用法
    OceanBase 分布式数据库【信创/国产化】- OceanBase V4.3 更新了什么 What‘s New
    《TCP/IP网络编程》代码实现
    Win11网络不稳定怎么办?Win11连接wifi频繁掉线的解决方法
    数据集市简介
    pytorch加载的cifar10数据集,到底有没有经过归一化
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/133184246