[LeetCode 第7题] -- Sort List

简介: 题目链接: Sort List题目意思: 给定一个链表头结点,在O(nlogn)时间内进行排序分析: 比较排序下限是O(nlogn),可以选择归并排序解决(事实证明,快速排序会TLE)代码:/** * Definition for singly-linked list.


题目链接: Sort List

题目意思: 给定一个链表头结点,在O(nlogn)时间内进行排序

分析: 比较排序下限是O(nlogn),可以选择归并排序解决(事实证明,快速排序会TLE)


代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void merge(vector<ListNode*> &arrList, int begin, int mid, int end);
    void mergeSort(vector<ListNode*> &arrList, int begin, int end);
    ListNode *sortList(ListNode *head);
};

void Solution::merge(vector<ListNode*> &arrList, int begin, int mid, int end){
    int i = begin;
    int j = mid+1;
    int pos = 0;
    int* tmpArr = new int[end-begin+2];
        
    while ((i <= mid) && (j <= end)) {
          if (arrList[i]->val <= arrList[j]->val) {
             tmpArr[pos++] = arrList[i++]->val;
          }
          else {
             tmpArr[pos++] = arrList[j++]->val;
          }
    }
    while (i <= mid) {
    	  tmpArr[pos++] = arrList[i++]->val;
    }
    while (j <= end) {
          tmpArr[pos++] = arrList[j++]->val;
    }
    for (i = 0, j = begin; i < pos; i++, j++) {
          arrList[j]->val = tmpArr[i];
    }
    delete tmpArr;
    tmpArr = NULL;
}

void Solution::mergeSort(vector<ListNode*> &arrList, int begin, int end) {
     if (begin >= end) {
         return;
     }
     int mid = (begin+end) >> 1;
     mergeSort(arrList, begin, mid);
     mergeSort(arrList, mid+1, end);
     merge(arrList, begin, mid, end);
}

ListNode* Solution::sortList(ListNode *head) {
     if (NULL == head) {
         return NULL;
     }
     ListNode* tmpHead = head;
     vector<ListNode*> arrList;
     while (tmpHead != NULL) {
         arrList.push_back(tmpHead);
         tmpHead = tmpHead->next;
     }
     mergeSort(arrList, 0, arrList.size()-1);
     return head;
}

目录
相关文章
|
Java
Leetcode 114. Flatten Binary Tree to Linked List
思路也很简单,先把root的左子树(如有)变成单链表 leftlinkedlist,把root的右子树(如有)变成单链表 rightlinkedlist,再把root的右节点变成leftlikedlist,再把rightlinkedlist接到leftlinkedlist后面,代码如下。
45 1
|
C++
Leetcode Copy List with Random Pointer(面试题推荐)
给大家推荐一道leetcode上的面试题,这道题的具体讲解在《剑指offer》的P149页有思路讲解,如果你手头有这本书,建议翻阅。
51 0
Leetcode 19.Remove Nth Node From End of List
删除单链表中的倒数第n个节点,链表中删除节点很简单,但这道题你得先知道要删除哪个节点。在我的解法中,我先采用计数的方式来确定删除第几个节点。另外我在头节点之前额外加了一个节点,这样是为了把删除头节点的特殊情况转换为一般情况,代码如下。
37 0
|
6月前
|
C++ 容器
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)
|
6月前
|
大数据 Java 程序员
「LeetCode合集」链表(List)及经典问题
「LeetCode合集」链表(List)及经典问题
51 0
|
算法 C++
SGI-STL源码剖析之list::sort()
SGI-STL源码剖析之list::sort()
110 0
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 75 Sort Colors 颜色分类(荷兰国旗)
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
92 0
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 206. 反转链表 Reverse Linked List
LeetCode 206. 反转链表 Reverse Linked List
下一篇
无影云桌面