首页 > 编程语言 >四种语言刷算法之排序链表

四种语言刷算法之排序链表

时间:2023-05-12 11:14:27浏览次数:41  
标签:ListNode val int second next 链表 算法 排序 first

力扣148. 排序链表

1、C

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* sortList(struct ListNode* head){
    int n = 0;
    struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    newHead->next = head;
    struct ListNode *p = head;
    while(p!=NULL){
        n++;
        p = p->next;
    }
    for(int i=1;i<n;i*=2){
        struct ListNode* q = newHead;
        for(int j=0;j+i<n;j+=i*2){
            struct ListNode* first = q->next;
            struct ListNode* second = first;
            for(int k=0;k<i;k++){
                second = second->next;
            }
            int a = 0,b = 0;
            while(a<i&&b<i&&second){
                if(first->val<second->val){
                    q->next = first;
                    q = q->next;
                    first = first->next;
                    a++;
                }
                else{
                    q->next = second;
                    q = q->next;
                    second = second->next;
                    b++;
                }
            }
            while(a<i){
                q->next = first;
                q = q->next;
                first = first->next;
                a++;
            }
            while(b<i&&second){
                q->next = second;
                q = q->next;
                second = second->next;
                b++;
            }
            q->next = second;
        }
    }
    return newHead->next;
}

2、C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        ListNode *newHead = new ListNode(-1);
        newHead->next = head;
        int n = 0;
        ListNode* p = head;
        while(p!=nullptr){
            p = p->next;
            n++;
        }
        for(int i=1;i<n;i*=2){
            ListNode* q = newHead;
            for(int j=0;j+i<n;j+=i*2){
                ListNode *first = q->next;
                ListNode *second = first;
                for(int k=0;k<i;k++){
                    second = second->next;
                }
                int a = 0,b = 0;
                while(a<i&&b<i&&second){
                    if(first->val<second->val){
                        q->next = first;
                        q = q->next;
                        first = first->next;
                        a++;
                    }
                    else{
                        q->next = second;
                        q = q->next;
                        second = second->next;
                        b++;
                    }
                }
                while(a<i){
                    q->next = first;
                    q = q->next;
                    first = first->next;
                    a++;
                }
                while(b<i&&second){
                    q->next = second;
                    q = q->next;
                    second = second->next;
                    b++;
                }
                q->next = second;
            }
        }
        return newHead->next;
    }
};

3、JAVA

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        ListNode newHead = new ListNode(-1,head);
        int n = 0;
        ListNode p = head;
        while(p!=null){
            n++;
            p = p.next;
        }
        for(int i=1;i<n;i*=2){
            ListNode q = newHead;
            for(int j=0;j+i<n;j+=i*2){
                ListNode first = q.next;
                ListNode second = first;
                for(int k=0;k<i;k++){
                    second = second.next;
                }
                int a = 0,b = 0;
                while(a<i&&b<i&&second!=null){
                    if(first.val<second.val){
                        q.next = first;
                        q = q.next;
                        first = first.next;
                        a++;
                    }
                    else{
                        q.next = second;
                        q = q.next;
                        second = second.next;
                        b++;
                    }
                }
                while(a<i){
                    q.next = first;
                    q = q.next;
                    first = first.next;
                    a++;
                }
                while(b<i&&second!=null){
                    q.next = second;
                    q = q.next;
                    second = second.next;
                    b++;
                }
                q.next = second;
            }
        }
        return newHead.next;
    }
}

4、Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def sortList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        newHead = ListNode(-1,head)
        n = 0
        p = head
        while(p is not None):
            n += 1
            p = p.next
        i = 1
        while(i<n):
            q = newHead
            j = 0
            while(i+j<n):
                first = q.next
                second = first
                for k in range(i):
                    second = second.next
                a,b = 0,0
                while(a<i and b<i and second is not None):
                    if first.val<second.val:
                        q.next = first
                        q = q.next
                        first = first.next
                        a += 1
                    else:
                        q.next = second
                        q = q.next
                        second = second.next
                        b += 1
                while(a<i):
                    q.next = first
                    q = q.next
                    first = first.next
                    a += 1
                while(b<i and second is not None):
                    q.next = second
                    q = q.next
                    second = second.next
                    b += 1
                j += i*2
                q.next = second
            i *= 2
        return newHead.next

标签:ListNode,val,int,second,next,链表,算法,排序,first
From: https://www.cnblogs.com/cmkbk/p/17380667.html

相关文章

  • 模板元编程实战--类型列表算法
    这篇文章主要说明了我学习的过程,作为一种记事本来记录,它讲述了如何处理一个类型列表的拼接,查找,排序,等算法。数据结构:template<typename...Ts>structTypeList{structisTypeList{};usingtype=TypeList<Ts...>;constexprstaticsize_tsize=sizeof...(......
  • 无刷直流电机有感方波 有感方波控制算法,包括电机相序确定方法,霍尔安装
    无刷直流电机有感方波有感方波控制算法,包括电机相序确定方法,霍尔安装位置确定方法,不同斩波方式(两两导通、33导通不一样)编写方法,霍尔换相表确定,霍尔自学习,各种启动方式的差异,带载堵转力矩保持,电流保护策略,前馈策略,带载降低超调的策略,等等。可以提供基础仿真模型,学习代码,一些文档......
  • 快速傅式变换PCB电路Multisim仿真 基于FPGA的FFT算法设计实现
    快速傅式变换PCB电路Multisim仿真基于FPGA的FFT算法设计实现,提供AD格式pcb及原理图,FPGA源码,Multisim仿真文件,大量文档说明资料。ID:3220684206097053......
  • DSP28335 永磁同步电机代码 CCS编辑,有PI控制算法、
    DSP28335永磁同步电机代码CCS编辑,有PI控制算法、速度电流双闭环控制。有方波有感无感算法,无感为3段反电势过零点。有pmsm有感无感算法,有感有hall的foc,有磁编码器的,有增量编码器的。无感为滑模观测器的。提供原理图,源代码ID:4150680238426920......
  • bms电池管理系统 锂电池算法SOC代码 获取锂电池SOC采用
    bms电池管理系统锂电池算法SOC代码获取锂电池SOC采用的是电流积分法,电化学阻抗法电流积分法又称为安时积分法或库伦计数,通过将电池电流对时间进行积分来计算电池的荷电状态。这种方法对于计算电池放出的电量有一定的准确度,但缺乏参照点,不能计算电池的初始SOC,也无法预测电池因为......
  • IGBT结温估算(算法+模型)国际大厂机密算法,多年实际应用,准确度良好……
    IGBT结温估算(算法+模型)国际大厂机密算法,多年实际应用,准确度良好……能够同时对IGBT内部6个三极管和6个二极管温度进行估计,并输出其中最热的管子对应温度。可用于温度保护,降额,提高产品性能。simulink模型除仿真外亦可生成代码……提供直流、交流两个仿真模型提供底层算法模型库(开源......
  • 异步机无感算法解析 提供推导文档,模型,代码…… md500
    异步机无感算法解析提供推导文档,模型,代码……md500ID:442500634075285690......
  • 霍尔Foc算法解析,代码 中颖单片机,3213 提供代码、电路图和pcb
    霍尔Foc算法解析,代码中颖单片机,3213提供代码、电路图和pcb算法对开关霍尔的处理颇有独到之处,是做hallfoc的良好参考……工程中坐标变换是库,算法是开源的,请知悉YID:38100634107899452......
  • LSSVM,SSA-LSSVM,VMD-LSSVM,VMD-SSA-LSSVM四种算法做短期电力负荷预测,做对比。
    LSSVM,SSA-LSSVM,VMD-LSSVM,VMD-SSA-LSSVM四种算法做短期电力负荷预测,做对比。结果分析-lssvm均方根误差(RMSE):0.79172平均绝对误差(MAE):0.4871平均相对百分误差(MAPE):13.079%结果分析-ssa-lssvm均方根误差(RMSE):0.64591平均绝对误差(MAE):0.44097平均相对百分误差(MAPE):10.4219%结果分析-vmd-......
  • 通过冒泡排序,实现通过值拿key
    '''实现冒泡排序后,输出关联字典的key通过值得列表,排序后,拿到字典的key,在透过key,可以关联另一个列表适用场景,比如投票后,要通过数据拿到前三名的名字'''a={'a':1,'b':2,'c':3,'d':4}s=[1,3,2,1]ss=[]list_k=[]foriinrange(len(s)):print('iiiiiiiiii......