有序链表合并C语言递归版--我稍微会一点编程

假期最后一天,闲着没事编个程,天天吆喝自己不会编程,其实还是稍微会一点的。

  以下是一个有序链表合并的代码,一刻钟内盲写,花了10分钟左右调试通过,通篇只有一个if语句作为递归退出条件!

#include <stdio.h>
#include <stdlib.h>

int a[] = {1,3,5,7,8,10,11,12,15,19,21,22,24,25,26};
int b[] = {2,4,5,6,9,16,17,18,27,30,31};

struct list {
        struct list *next;
        int v;
};

void merge(struct list *iter, struct list *base)
{
        struct list *last = iter;

        if (!iter) {
                return;
        }
        iter = iter->next;

        while (iter && (!base || iter->v < base->v)) {
                last = iter;
                iter = iter->next;
        }
        last->next = base;
        merge(base, iter);
}

int main(int argc, char **argv)
{
        int i = 0, j = 0;
        struct list *al = (struct list*)calloc(15, sizeof(*al));
        struct list *bl = (struct list*)calloc(11, sizeof(*bl));
        struct list *itera;
        struct list *iterb;

        // create 2 lists
        {
                for (i = 0; i < 15; i++) {
                        itera = &al[i];
                        itera->v = a[i];
                        itera->next = &al[i+1];
                }
                itera->next = NULL;

                for (i = 0; i < 11; i++) {
                        iterb = &bl[i];
                        iterb->v = b[i];
                        iterb->next = &bl[i+1];
                }
                iterb->next = NULL;
        }

        // merge 2 lists
        {
                merge(al, bl);
        }

        // print the result
        {
                for (; al; al=al->next) {
                        printf("%d \n", al->v);
                }
        }
}

本来想为这种行为找点意义,因为这实在是太简单了(简单并不意味着每个人都能写对,我就总是搞不定边界判断),我有时间不去搞TCP不去搞SDWAN,弄这干什么?

  主要是假期的旅行泡汤了,本来是想外出的,然而没有成行,就在家里待了三天。

  啊哈,可以教小小啊!可以教小小怎么把两个有序的链表合并成一个。当我做完这个程序后,搜了一下网上别人写的方案,发现还是我的最简单了,我也不考虑什么时间复杂度了,总之能让一个六岁的智商平平的小孩子用最短时间理解这段代码才是根本目的,于是也就不炫技了。

  竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生!然而,何来烟雨?何谓平生?

猜你喜欢

转载自blog.csdn.net/dog250/article/details/80154795