无表头单链表的总结----两个链表合并

#include"head.h"
struct Student* insert(struct Student*ahead, struct Student*bhead)
{
    struct Student *pa1, *pa2, *pb1, *pb2;
    pa1 = pa2 = ahead;
    pb1 = pb2 = bhead;
    if ((ahead != NULL)&&(bhead != NULL))    {
        do
        {
            while ((pb1->num > pa1->num) && (pa1->next != NULL)) //先找到要插入的位置
            {
                pa2 = pa1;
                pa1 = pa1->next;     //pa1在前,pa2在后
            }
            if (pb1->num <= pa1->num)
            {
                if (pa1 == ahead) ahead = pb1; //pb1往上要么把插入的链表链接到头指针
                else pa2->next = pb1;//pb1往上要么把插入的链表链接到pa2->nex
                pb1 = pb1->next; //先把pb1往下一个要插的节点移,释放pb1
                pb2->next = pa1;//往下把插入的节点连接到原列表pa1处
                pa2 = pb2;//把pa2指向刚插入的链表pb2,与pa1挨着,回归原始状态
                pb2 = pb1;//再把pb2移到pb1处,回归原始状态
            }
        } while ((pa1->next != NULL) || (pb1 != NULL&&pa1 == NULL));
//循环条件,还没有指向原链表最后一个元素或者pb还有元素且原列表不空
        if ((pb1 != NULL) && (pb1->num > pa1->num) && (pa1->next == NULL))
            pa1->next = pb1;  //原列表已经插到最后了
    }
    else if ((ahead == NULL) && (bhead != NULL)) ahead = bhead;
    return ahead;
}

//分四种情况,{alist=null,blist=null},{ alist!=null,blist=null },{ //alist=null,blist=!null },
//{ alist=!null,blist=!null },第四种最复杂。
时间: 2025-01-07 13:31:43

无表头单链表的总结----两个链表合并的相关文章

27、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:同归并算法 本题: 1 public class Solution { 2 public ListNode Merge(ListNode list1, ListNode list2) { 3 ListNode head; 4 if (list1 == null) { 5 return list2; 6 } 7 if (list2 == null) { 8 return list1; 9 } 10

[链表]同时遍历两个链表

两个有序链表的合并 对于两个有序链表合并成一个新的有序链表的代码很简单,但是要注意一些测试用例: 比如说一个为空链表:两个链表不一样长,肯定最后有一个链表要单独的挂到结果链表中去的. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; ListNode dummy(-1); ListNode *p = &dummy; while(l1 !

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

新增一个链表,然后分别采用2个指针指向这两个链表,每次比较链表的值,将较小的那一个存入新链表中.需要主要的是对空链表进行处理,主要还是考察代码的鲁棒性.总共2个链表,数组分别是1,3,5,7,和2, 4, 6,8 采用java进行实现. package com.test.algorithm; class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Me

无表头单链表的总结----增加节点(原链表为有序的链表)

1 #include"head.h" 2 struct Student* insert(struct Student*head, struct Student*addinfo) 3 { 4 struct Student *p0, *p1, *p2; //开辟三个结构体指针 5 p2=p1 = head; //头指针赋给p1,p2 6 p0 = addinfo; //把 增加信息的指针赋给p0,习惯不用原来指针 7 if (head == NULL) 8 { 9 head = p0 //

无表头单链表的总结----动态建立链表

1 #include "head.h" 2 struct Student *creat() 3 { 4 struct Student *head, *p1, *p2;// 先开辟三个结构体指针,*head,(作为返回的头指针) 5 p1 = p2 =(struct Student *) malloc(LEN); 6 scanf_s("%s %f", p1->num, N, &p1->score);//先读取输入的信息,据读入的信息进行判断 7 h

无表头单链表的总结----删除节点

1 #include "head.h" 2 struct Student*del(struct Student*head,char num[N]) 3 { 4 struct Student*p1, *p2; 5 if (head == NULL) //若链表为空,则无需处理 6 { 7 printf("\nlist NULL!\n"); 8 return (head); 9 } 10 p2 = p1 = head; 11 while (strcmp(num, p1-

无表头单链表的总结----如何将已经初始化的结构体数组加入链表关系

1 struct Student 2 { 3 char ID[N_ID]; 4 char name[N_name]; 5 struct Student *next; 6 }alist[LEN_A],blist[LEN_B]; 7 ////以上是结构体 8 //初始化 9 struct Student alist[LEN_A] = { {"101","Wang"} ,{"102","Li"},{"105",&

无表头单链表的总结----输出链表

#include"head.h" void print(struct Student* head) { struct Student *p; printf("There are %d records:\n", sum); p = head; if (p != NULL) { do { printf("%ld %d\n", p->num, p->score); p = p->next; } while (p != NULL); /

无表头单链表的总结----从链表中删除某一个年纪的的节点

1 #include "head.h" 2 struct Student *del_same_age(struct Student*head, int age) 3 { 4 struct Student *p, *pt; int find = 0; 5 p = pt = head; 6 while (p != NULL)//当循环到最后一个节点时 7 { 8 9 if (p->stu_age == age)//如果相等 10 { 11 find++; //说明找到了 12 if