关于链表的归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangshanfeng_/article/details/82530712

sort list

算法概论第一周

文章目录


题目链接

题目描述

Sort a linked list in O(n log n) time using constant space complexity.
Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

##题目分析

  • O ( n l o g n ) O(n log n) 的复杂度,肯定要求要在原链表数据结构的基础上进行排序,将其转换为数组是开销很大的。
  • 避免内存分配

##解题思路

  • 标准的归并排序,原理如图:
    图片加载失败
  • 同时要考虑链表的数据结构
  • 故每次递归的过程分为找链表中点和排序
  • 注意排序链表长度为0和1的特殊情况
  • 注意两条链表同时排序后,剩下一小段链表的处理

##代码

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        ListNode* fid = head;
        int nodeNum = 0;
        while(fid){
        	nodeNum++;
        	fid = fid->next;
        }
        if(nodeNum == 0 || nodeNum == 1)
            return head;
        else{
            int halfNum = nodeNum / 2;
            ListNode* fhalf = head;
            for(int i = 0; i < halfNum - 1; i++){
                fhalf = fhalf->next;
            }
            ListNode* rhalf = fhalf->next;
            fhalf->next = NULL;
            return merge(sortList(head), sortList(rhalf));
        }
    }
    ListNode* merge(ListNode* l1, ListNode* l2){
        ListNode* resHead = new ListNode(-1);
        ListNode* resCurr = resHead;
        while(l1 && l2){
            if(l1->val < l2->val){
                resCurr->next = l1;
                l1 = l1->next;
            }
            else{
                resCurr->next = l2;
                l2 = l2->next;
            }
            resCurr = resCurr->next;
        }
        if(l1){
            resCurr->next = l1;
        }
        else if(l2){
            resCurr->next = l2;
        }
        return resHead->next;
    }
};

猜你喜欢

转载自blog.csdn.net/zhangshanfeng_/article/details/82530712
今日推荐