已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。

#include <stdio.h>
#include <stdlib.h>
#define N 10

typedef struct student
{
    int num;
    float score;
    struct student *next;
}stu;

stu *creat()
{
    int i;
    stu *p,*head = NULL,*tail = head;
    for (i = 0; i < N; i++)
    {
        p = (stu *)malloc(sizeof(stu));
        scanf("%d%f",&p->num,&p->score);
        p->next = NULL;
        if ( p->num <= 0)
        {
            free(p);
            break;
        }
        if(head == NULL)
            head = p;
        else
            tail->next = p;
        tail = p;
    }
    return head;
}

void print(stu *p)
{
    while (p != NULL)
    {
        printf("%d\t%.2f\n",p->num,p->score);
        p = p->next;
    }
}

stu *link(stu *p1,stu *p2)
{
    stu *p,*head;
    if ( p1->num < p2->num ) 
    {
        head = p = p1;
        p1 = p1->next;
    }
    else
    {
        head = p = p2;
        p2 = p2->next;
    }
    while ( (p1 != NULL) && (p2 != NULL ))
    {
        if (p1->num < p2->num)
        {
            p->next = p1;
            p = p1;
            p1 = p1->next;
        }
        else
        {
            p->next = p2;
            p = p2;
            p2 = p2->next;
        }
    }
    if(p1 != NULL)
        p->next = p1;
    else
        p->next = p2;

    return head;
}

int main() 
{
    stu *a,*b,*c;
    printf("\n请输入链表a的信息,学号小于等于零时结束输入:格式(学号 成绩)\n");
    a = creat();
    printf("\n请输入链表b的信息,学号小于等于零时结束输入:格式(学号 成绩)\n");
    b = creat();
    printf("\n链表a的信息为:\n");
    print(a);
    printf("\n链表b的信息为:\n");
    print(b);
    c = link(a,b);
    printf("\n合并后的链表信息为:\n");
    print(c);
    return 0;
}
时间: 2024-10-17 08:29:52

已有a,b两个链表,每个链表中的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。的相关文章

[PHP] 算法-请找出带环链表的环的入口结点的PHP实现

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 2.原理有点像上面的,定义两个指针,一个是快指针每次走两步,一个是慢指针每次走一步,当两个相遇的时候,假设环的长度为n个结点,慢指针走x步,快指针走2x步,2x=x+kn ;x=kn; k暂时假定为1圈 ,也就是慢指针slow

创建链表的同时自动完成结点数据排序

/* 创建链表时自动完成链表上结点按某一关键字排序 最简单的方法是在创建链表时用插入结点的方式完成链表的建立 /* C++代码 */ #include <iostream> using namespace std; struct node //结点结构 { int data ; node * next; }; int main() { node * CreateList( ); //建立链表函数声明 void PrintList( node *); //输出链表中结点信息函数声明 node *

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i

两个链表的第一个公共结点-剑指Offer

两个链表的第一个公共结点 题目描述 输入两个链表,找出它们的第一个公共结点. 思路 若用暴力比较,一个个的节点比较,时间复杂度为O(n2),不可取 根据题意,两个链表若有公共节点,最终要连起来,像一个Y形,所以我们从后往前遍历,但是单向链表只能从前往后,所以这符合“先进后出”,可以用两个辅助栈 也可以不用辅助栈,我们先将两个链表遍历一遍,获取长度大小,然后从长的先开始遍历,到达相等长度后同时开始遍历,直到遍历到相等的节点 这个问题可以类比到求二叉树中两个叶结点的最低公共祖先的问题 代码 /* p

剑指offer (37) 两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点 如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部 如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在 如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等" 我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到 ListN

【剑指offer】两个链表的第一个公共结点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26097395 简单题,剑指offer上的第37题,九度OJ上AC. 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应

剑指offer(四十四)之两个链表的第一个公共结点

题目描述 输入两个链表,找出它们的第一个公共结点. 思路分析:将其中一个链表结点,存进HashMap中,将利用ContainsKey()进行判断是否有公共结点 代码1: <span style="color:#6600cc;">import java.util.*; public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { ListNode

剑指Offer-35.两个链表的第一个公共结点(C++/Java)

题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { int d1 = 0; int d2 = 0; int d = 0; ListNode* p1 = pHead1; ListNode* p2 = pHead