精华内容
下载资源
问答
  • 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->...

    题目

    给你一个链表数组,每个链表都已经按升序排列。
    请你将所有链表合并到一个升序链表中,返回合并后的链表。

    示例 1:
    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    解释:链表数组如下:
    [
    1->4->5,
    1->3->4,
    2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6

    示例 2:
    输入:lists = []
    输出:[]

    示例 3:
    输入:lists = [[]]
    输出:[]

    提示:
    k == lists.length
    0 <= k <= 10^4
    0 <= lists[i].length <= 500
    -10^4 <= lists[i][j] <= 10^4
    lists[i] 按 升序 排列
    lists[i].length 的总和不超过 10^4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

    思路

    1、每次循环添加一个节点,并将添加节点所在的链表移位,赋值到数组中;
    2、每次循环中遍历数组,寻找最小值所在的节点,即为添加节点;

    程序

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    
    struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
        int i, Min, iMin, izcnt = 0,iflag = 1;
        struct ListNode* head = NULL;
        struct ListNode* node = NULL;
        
        /*判断链表是否都为空*/
        iflag = 0;
        for(i=0;i<listsSize;i++){
            if(lists[i] != NULL){
                iflag = 1;
            }else{
                izcnt++;
            }
        }
        while(iflag){
            /*获取最小值的初始值*/
            for(i=0;i<listsSize;i++){
                if(lists[i] != NULL){
                    Min = lists[i]->val;
                    iMin = i;
                    break;
                }
            } 
            /*获取最小值和最小序列*/
            for(i=i+1;i<listsSize;i++){
                if(lists[i] != NULL){
                    iMin = Min > lists[i]->val ? i : iMin;
                    Min = Min > lists[i]->val ? lists[i]->val : Min;
                }
            } 
            /*连接链表*/
            if(head == NULL){
                head = lists[iMin];
                node = head;
            }else{
                node->next = lists[iMin];
                node = node->next;
            }
            /*移动链表*/
            lists[iMin] = lists[iMin]->next;
            /*记录空链表个数,全部为空时,停止循环*/
            if(lists[iMin] == NULL){
                izcnt++;
                if(izcnt == listsSize){
                    iflag = 0;
                }
            }
        }
        return head;
    }
    
    
    展开全文
  • C语言升序排列

    2020-12-17 22:56:47
    //升序排列 #include<stdio.h> void sort(int array[],int n); //排序函数声明 void swap(int *ex1,int *ex2); //交换函数声明 int main() { int a[10],i; printf(“请输入要排列的数字:\n”); for(i=0;i<...

    @TOCC语言中的排列

    1,代码

    //升序排列
    #include<stdio.h>
    void sort(int array[],int n); //排序函数声明
    void swap(int *ex1,int *ex2); //交换函数声明
    int main()
    {
    int a[10],i;
    printf(“请输入要排列的数字:\n”);
    for(i=0;i<(sizeof a/sizeof a[0]);i++){
    scanf("%d",&a[i]);}
    sort(a,sizeof a/sizeof a[0]);
    printf(“排列之后的数字是:\n”);
    for(i=0;i<(sizeof a/sizeof a[0]);i++){
    printf("%d",a[i]);}
    printf("\n");
    return 0;
    }
    void sort(int array[],int n)
    {
    int i,j,k,temp;
    for(i=0;i<n-1;i++){
    k=i;
    for(j=i+1;j<n;j++){
    if(array[j]<array[k]){
    k=j;
    }
    }
    // temp=array[k];array[k]=array[i];array[i]=temp; //可以用swap代替
    swap(&array[k],&array[i]);
    }
    }
    void swap(int *ex1,int *ex2)
    { int mid;
    mid=*ex1;
    *ex1=*ex2;
    *ex2=mid;
    }

    收获

    在写完排序代码之后,我又有了一些新的体会:
    1,对指针的理解加深了,之前在输出排列完之后的数时我写的是
    printf("%d",&a[i]);
    结果输出的是十进制的地址,开始我还以为是算法错了,编译器也没有报错,后来才发现错了。但是通过之歌小错误,又加深了对printf的理解。
    2,sizeof a/sizeof a[0];这个方法最早我是在MOOC大学上翁恺老师的课堂上看到的,我个人觉得很巧妙,就学习借鉴过来了,下面简单介绍一下用法:sizeof a是数组所占的字节,而sizeof a[0]是首元素所占的字节。所以sizeof a/sizeof a[0]就是数组的长度。
    3,前面的这段代码只要修改一个符号就可以实现降序排列。

    展开全文
  • 思路: 分为三步,找,删,头插 找最大值,因为头插法每次都是插入一个头结点。 第一步查找 for (q = pm = h, p = h->next;p;q = p,p = p->next) { if (p->date > pm->...第二...

    思路: 分为三步,找,删,头插
    找最大值,因为头插法每次都是插入一个头结点。
    第一步查找

    for (q = pm = h, p = h->next;p;q = p,p = p->next)
    		{
    			if (p->date > pm->date)
    			{
    				pm = p;
    				qm = q;
    			}
    		}
    

    q,p联动跑,qm始终是pm的前驱
    第二步删除(不free)

            if (pm - h)
    			qm->next = pm->next;
    		else
    			h = h->next;
    

    删中间尾前驱挂后继
    删头 移动头指针

    第三步 头插

            pm->next = h1;
    		h1 = pm;
    

    代码如下
    运行环境:VS2017

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node
    {
    	int date;
    	struct node*next;
    }ElemSN;
    //创建链表
    ElemSN*GreatLink(int Date[], int n)
    {
    	int i;
    	ElemSN*p, *t = 0, *h = 0;
    	for (i = 0;i < n;i++)
    	{
    		p = (ElemSN*)malloc(sizeof(ElemSN));
    		p->date = Date[i];
    		p->next = NULL;
    		if (!h)
    			h = t = p;
    		else
    			t = t->next = p;
    	}
    	return h;
    }
    //输出链表
    PrintLink(ElemSN*h)
    {
    	ElemSN*p;
    	for (p = h;p;p = p->next)
    		printf("%3d", p->date);
    	printf("\n");
    }
    
    ElemSN*SelectMax(ElemSN*h)
    {
    	ElemSN *p = NULL, *q = NULL, *pm = NULL, *qm = NULL, *h1 = NULL;
    	q = pm = h;
    	p = h->next;
    	while (h)
    	{
    		for (q = pm = h, p = h->next;p;q = p,p = p->next)
    		{
    			if (p->date > pm->date)
    			{
    				pm = p;
    				qm = q;
    			}
    		}
    		if (pm - h)
    			qm->next = pm->next;
    		else
    			h = h->next;
    		pm->next = h1;
    		h1 = pm;
    	}
    	return h1;
    }
    
    
    int main(void)
    {
    	int a[6] = { 3,2,5,8,4,7 };
    	ElemSN*head, *h1;
    	head = GreatLink(a, 6);
    	PrintLink(head);
    	h1 = SelectMax(head);
    	PrintLink(h1);
    	system("pause");
    }
    

    运行结果: 3 2 5 8 4 7
    2 3 4 5 7 8

    展开全文
  • 主要为大家详细介绍了C语言合并两个带头节点升序排列链表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • /* 编写函数将两个升序排列的字符串融合成一个字符串, 融合后的字符串依然是升序排列的 */ #include&lt;stdio.h&gt; #include&lt;string.h&gt; int main(void) { char a[20],b[20],c[40];//a,b...
    /*  编写函数将两个升序排列的字符串融合成一个字符串,
    融合后的字符串依然是升序排列的 */
    
    #include<stdio.h>
    #include<string.h>
    int main(void)
    {
    	char a[20],b[20],c[40];//a,b融合成c
    	int i=0,j=0,k=0;
            gets(a);
    	gets(b);         //读入a,b
    	
    	while(a[i]!='\0'&&b[j]!='\0')
    	{
    	  if(a[i]>b[j])//若a中当前的字符大于b中的字符,
    	    c[k++]=b[j++];//则把b中当前字符赋給c;下标自增1
    	 else           
    	    c[k++]=a[i++];//否则把a中当前字符赋給c
    	}
    	
    	if(a[i]!=0)//若a还未遍历完,则把a剩下的字符逐一赋給c
    	{
    	    while(a[i]!='\0')
    	        c[k++]=a[i++];
    	}
    	else //若b还未遍历完,则把b剩下的字符逐一赋給c
    	{
    	    while(b[j]!='\0')
    		c[k++]=b[j++];
    	}
    	
    	c[k]='\0';//由于c是字符串,末尾以'\0'结尾
    	puts(c);  //输出c
    		
    	return 0;
    }

     

    展开全文
  • 在一个升序排列的数组中插入一个数 (10分) 编写函数fun,在一个已按升序排列的数组中插入一个数,插入后,数组元素仍按升序排列。 函数接口定义: void fun(int a[N],int number); 其中 a 和 number 都是用户传入的...
  • C语言任意读入10个整数,将其用冒泡法按升序排列后输出 代码: #include<stdio.h> void main(){ int t,i,j,a[10]={1,3,5,7,8.10,2,4,6,9}; for(i=1;i<10;i++){ for(j=0;j<i;j++){ if(a[i]<a[j]) ...
  • #include<stdio.h> void sort(int x[], int n); int main() { int arr[10] = { 11,3,7,23,15,79,66,58,69,45 }, i; sort(arr, 10); printf("排序结果如下:\n"); for (i = 0; i <......
  • #include<stdio.h> void sort(int *x,int n); int main() { int arr[10] = { 11,3,7,23,15,79,66,58,69,45 },i; sort(arr, 10); printf("排序结果如下:\n"); for (i = 0; i <... ...
  • T155235 判断升序排列

    2020-11-09 21:43:53
    T155235 判断升序排列 题目描述: 思路: ①:题目要求读到文件末尾符为止,在读取文件时到达文件末尾会产生读入失败的现象,此时scanf会返回-1,而在C语言中使用EOF(End Of File)来代表-1。 ②:由于数据范围是...
  • #include<stdio.h> void sort(int x[],int n); int main() { int arr[10] = { 11,3,7,23,15,79,66,58,69,45 },i; sort(arr, 10); printf("排序结果如下:\n"); for (i = 0; i <... ...
  • c语言描述将两个字符串连在一起且按升序排列 #include #include #define P printf int n; char * x(char *p1,char *p2) { char temple,temple2; int i,j,k,e,d,f; /* char a[]={"aegikl"}; char b[]={...
  • //c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加 /* 主要函数思想: 初始化一元多项式A 初始化一元多项式B 初始化一元多项式C 给一元多项式A赋入数据 给一元多项式B赋入数据(指数升序) 当A...
  • c语言按行倒序读取文件 Output Output 翻译自: https://www.thecrazyprogrammer.com/2015/03/cc-program-to-read-infinite-numbers-and.htmlc语言按行倒序读取文件
  • 例题:给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。 注意:请勿改动主函数main与其他函数中的任何内容,仅在横线上填写所需的若干表达式或语句。 代码如下: #...
  • 已有a,b两个链表,每个链表中的结点包括学号,成绩. 要求把两个链表合并, 按学号升序排列.
  • 要求把两个链表合并,按学号升序排列。 #include<stdio.h> #include<stdlib.h> #define N sizeof(struct student) typedef struct student { int num; char name[20]; float score[3]; float a
  • 例题:请补充fun函数,该函数的功能是:把字符串s中的字符按字符的ASCII码升序排列,处理后的字符串仍然保存在原串中,字符串及其长度作为函数参数传入。 例如,若干输入 “edcba”,则输出为 “abcde”。 请勿改动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 413
精华内容 165
关键字:

升序排列c语言

c语言 订阅