148.排序链表

题目描述:

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

思想1:

在链表中间断开,使用递归+归并排序对链表进行排序

代码:

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if(head==0 || head->next ==0)
            return head;
        
        ListNode* fast = head;
        ListNode* slow = head;
        ListNode* pre;

        while(fast!=0&&fast->next!=0){
            pre = slow;
            fast = fast->next->next;
            slow = slow->next;
        }
        pre->next = 0;//断开链的中点
        return merge(sortList(head),sortList(slow));

    }

    ListNode* merge(ListNode* l1, ListNode*l2){
        if(l1==0)return l2;
        if(l2==0)return l1;
        if(l1->val > l2->val){
            l2->next = merge(l2->next,l1);//这里实在是太漂亮了,代码竟然还可以这样写
            return l2;
        }
        else{
            l1->next = merge(l1->next,l2);
            return l1;
        }
    }
};

思想2(我自己的思路):

遍历链表,每次确定val最小的位置min_ptr,将其值与当前链表头p的值交换

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        ListNode* p;
        p = head;
        while(p){
            int min_val = p->val;
            ListNode* q = p->next;
            ListNode* min_ptr=NULL;
            while(q){
                if(q->val<min_val){
                    min_val = q->val;
                    min_ptr = q;
                }
                q = q->next;
            }
            if(min_ptr){
                min_ptr->val = p->val;
                p->val = min_val;
            }
            p = p->next;
        }
        return head;
    }
};

 

posted @ 2020-04-20 15:26  thefatcat  阅读(82)  评论(0编辑  收藏  举报