排序链表(归并/非递归实现)

题目:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int getlength(ListNode *head) {
        int n = 0;
        while(head) head = head->next,++n;
        return n;
    }
    ListNode* split(ListNode *head,int n) {
        ListNode *tmp;
        while(--n && head) head = head->next;
        if(head == nullptr) return  head;
        tmp = head->next;
        head->next = nullptr;
        return tmp;
    }
    void merge(ListNode *&p,ListNode *left,ListNode *right) {
        while(left && right) {
            if(left->val < right->val) {
                p->next = left;
                p = p->next;
                left = left->next;
            }else {
                p->next = right;
                p = p->next;
                right = right->next;
            }
        }
        while(left) {
            p->next = left;
            p = p->next;
            left = left->next;
        }
        while(right) {
            p->next = right;
            p = p->next;
            right = right->next;
        }
    }
    ListNode* sortList(ListNode* head) {
        int n = getlength(head);
        ListNode *left,*right;
        ListNode *newhead = new ListNode(-1);
        newhead->next = head;
        ListNode *pre = newhead,*cur,*p;
        for(int sz = 1;sz < n;sz <<= 1) {
            cur = newhead->next;
            p = newhead;
            while(cur) {
                left = cur;
                right = split(left,sz);
                cur = split(right,sz);
                merge(p,left,right);
            }
        }
        return newhead->next;
    }
};
发布了152 篇原创文章 · 获赞 2 · 访问量 6458

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/104642364