leetcode第一刷_Sort List

来源:互联网 发布:淘宝客服兼职多少钱 编辑:程序博客网 时间:2024/05/01 19:19

这道题其实是道数据结构的题,跟链表相关的问题一般都比较直接,但是比较麻烦。

排序嘛,大家都知道最好的平均复杂度就是O(NlogN)的,看到logN,马上可以想到分治法。置于常数的空间,说明是在原来的链表上处理的。

我的做法是,先把原来的链表拆成长度相等的两段,分别对两段排序,然后merge一下,完全归并排序的思路。合并时,先确定新链表的头是哪个,然后用两个指针扫描两段,按照大小关系来连接后面的节点,当有一条为空时,把另一条接到最后就可以了。

ac代码如下,没有什么好说的了。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */ListNode* mergeList(ListNode *n1, ListNode *n2){ListNode *l1, *l2, *pre, *head;if(n1 == NULL)return n2;if(n2 == NULL)return n1;if(n1->val>n2->val){pre = head = n2;l1 = n2->next;l2 = n1;}else{pre = head = n1;l1 = n1->next;l2 = n2;}while(l1 != NULL && l2 != NULL){if(l1 -> val <= l2 ->val){pre->next = l1;pre = l1;l1 = l1->next;}else{pre->next = l2;pre = l2;l2 = l2->next;}}if(l1 != NULL){pre->next = l1;}else if(l2 != NULL){pre->next = l2;}return head;} class Solution {public:    ListNode *sortList(ListNode *head) {    if(head == NULL)    return NULL;    //cout<<"*"<<head->val<<endl;        int length = 0;        ListNode *mHead = head, *halfNode = head;        while(mHead != NULL){length++;mHead = mHead->next;}if(length == 1)return head;int half = length/2;//cout<<length<<endl;for(int i=0;i<half&&halfNode;i++){mHead = halfNode;halfNode = halfNode->next;}mHead->next = NULL;ListNode *left = sortList(head);ListNode *right = sortList(halfNode);return mergeList(left, right);    }};


0 0