[leetcode-148]Sort List(c)

来源:互联网 发布:python 最小值 索引 编辑:程序博客网 时间:2024/05/18 22:46

问题描述:
Sort a linked list in O(n log n) time using constant space complexity.

分析:这里O(nlogn)的时间复杂度,肯定是归并排序和快排。但是这里是list存储的,所以不大好处理。
方法是:
先把list分为两段,每段以null为结尾。不以null为结尾行不行?不行,至少不方便,特别是在合并的时候,找不到终止点。
在归并的时候,维护一个left、right指针,以及一个当前指针和一个头指针。然后再继续合并。

代码如下:20ms

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */struct ListNode* mergeNode(struct ListNode* head) {    struct ListNode* slow = head, *fast = head;    while (fast != NULL && fast->next != NULL) {        if (fast && fast != NULL) fast = fast->next;        if (fast && fast != NULL) fast = fast->next;        if (slow && fast != NULL) slow = slow->next;    }    if (fast == slow)//只剩下一个        return slow;    struct ListNode *tmpNode = slow->next;    slow->next = NULL;    struct ListNode *leftHead = mergeNode(head);    struct ListNode *rightHead = mergeNode(tmpNode);    //合并    struct ListNode *left = leftHead, *right = rightHead;    struct ListNode *tmpHead = NULL;    struct ListNode *curNode = NULL;    while (left != NULL && right != NULL) {        if (left->val < right->val) {            if (!curNode) {                tmpHead = left;            }            else                curNode->next = left;            curNode = left;            left = left->next;        }        else {            if (!curNode) {                tmpHead = right;            }            else                curNode->next = right;            curNode = right;            right = right->next;        }    }    if (left != NULL)        curNode->next = left;    else if (right != NULL)        curNode->next = right;    return tmpHead;}struct ListNode* sortList(struct ListNode* head) {    return mergeNode(head);}
0 0
原创粉丝点击