leetcode-148:排序链表

简介: leetcode-148:排序链表

题目

题目连接

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例 1:

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

解题

方法一:利用数组排序

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if(!head) return nullptr;
        //把链表节点加入到vector中
        vector<ListNode*> arr;
        ListNode* cur=head;
        while(cur){
            arr.push_back(cur);
            cur=cur->next;
        }
        //根据节点的值对vector排序
        sort(arr.begin(),arr.end(),[](ListNode* a,ListNode* b){
            return a->val<b->val;
        });
        //将vector中的节点串起来即可
        for(int i=0;i<arr.size();i++){
            if(i==arr.size()-1) arr[i]->next=nullptr;
            else{
                arr[i]->next=arr[i+1];
            }
        }
        return arr[0];
    }
};

方法二:归并排序

参考链接

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if(!head||!head->next) return head;
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast->next&&fast->next->next){
            slow=slow->next;
            fast=fast->next->next;
        }
        // 切链
        fast=slow->next;
        slow->next=nullptr;
        return merge(sortList(head),sortList(fast));
    }
    ListNode* merge(ListNode* l1,ListNode* l2){
        ListNode dummy;
        ListNode* cur=&dummy;
        while(l1&&l2){
            if(l1->val<l2->val){
                cur->next=l1;
                l1=l1->next;
            }else{
                cur->next=l2;
                l2=l2->next;
            }
            cur=cur->next;
        }
        cur->next=l1?l1:l2;
        return dummy.next;
    }
};

方法三:快排

#include<iostream>
#include<climits>
#include<vector>
#include<algorithm>
#include<numeric>
#include <string>
using namespace std;
struct Node{
    int val;
    Node* pre;
    Node* next;
    Node(int _val):val(_val),pre(nullptr),next(nullptr){}
};
void pushNode(Node* tail,Node* p){
    tail->next=p;
    p->pre=tail;
}
void quickSort(Node* head,Node* tail){
    if(tail==nullptr||head==nullptr||head==tail) return;
    Node* p1=head;
    Node* p2=tail;
    while(p1!=p2){
        while(p1!=p2&&p2->val>=head->val) p2=p2->pre;
        while(p1!=p2&&p1->val<=head->val) p1=p1->next;
        swap(p1->val,p2->val);
    }
    swap(p1->val,head->val);
    quickSort(head,p1->pre);
    quickSort(p1->next,tail);
}
int main(){
    Node* head=new Node(1);
    Node* tail=head;
    Node* p2=new Node(3);
    pushNode(tail,p2);
    tail=tail->next;
    Node* p3=new Node(2);
    pushNode(tail,p3);
    tail=tail->next;
    quickSort(head,tail);
    for(Node* cur=head;cur;cur=cur->next){
        cout<<cur->val<<endl;
    }
    system("pause");
    return 0;
}
相关文章
|
1月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
1月前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
1月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
24天前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
1月前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
1月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
1月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
43 0