人生加速器法解题

LT147 指针数组思路

直接操作结构体指针的话,会很慢,所以一种比较笨拙的方法油然而生(我真是一根筋):创立一个指向每一个节点的指针数组,然后比较数组的值,交换指针,来实现排序。(不怕麻烦 + 给自添堵 第一名 )我愿称其为:人生加速器法。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* insertionSortList(struct ListNode* head){
    struct ListNode* p = head;
    int length = 0;
    while(p){
        ++length;
        p = p->next;
    }
    struct ListNode** arr = (struct ListNode**)malloc(sizeof(struct ListNode*)*length);
    p = head;
    for(int i=0; i<length; ++i){
        arr[i] = p;
        p = p->next;
        /*
        printf("%d", (arr[i])->val);
        if(i!=length-1){
            printf(", ");
        }
        */
    }
    //printf("\n");
    for(int i=0; i<length; ++i){
        for(int j=0; j<length-1-i; ++j){
            if(arr[j]->val > arr[j+1]->val){
                struct ListNode* temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    p = arr[0];
    //printf("%d", p->val);
    for(int i=1; i<length; ++i){
        p->next = arr[i];
        //printf("%d", p->next->val);
        p = p->next;
    }
    
    return p;
}

test:

#include <stdio.h>
#include <stdlib.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
void insert(struct ListNode* head, int num){
    //struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
    if(head == NULL){
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        head = temp;
        head->val = num;
        head->next = NULL;
    }else{
        struct ListNode* p = head;
        while(p->next){
            p = p->next;
        }
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->next = temp;
        temp->val = num;
        temp->next = NULL;
    }
}

void display(struct ListNode* head){
    struct ListNode* p = head;
    while(p){
        printf("%d, ", p->val);
        p = p->next;
    }
}

int main(){
    struct ListNode* list = (struct ListNode*)malloc(sizeof(struct ListNode));
    list->next = NULL;
    list->val = 0;

    insert(list, 1);
    insert(list, 2);
    insert(list, 3);
    display(list);
    return 0;
}

2021-08-03_3:54:02 更新:爷先去睡个觉,回来优化

刚躺下就想到bug在哪里了,leetcode提示我是时间超时,仔细通过printf大法检查的时候,发现结果既然是正确的,那会不会是终止条件没有给对,顺着这个思路果然是最后一个节点忘记让他的下一项为空了,于是在 line42 最后一个for循环结尾加上:

if(i == length-1){
            p->next = NULL;
        }

即可解决问题,提交运行,结果通过~虽然又慢又长,但这个方法个人感觉挺牛逼的(并不)

posted @ 2021-08-03 04:34  CharmingZh  阅读(43)  评论(0编辑  收藏  举报