两条带头结点的升序重复合并成一个无重复的升序链表

#include<stdio.h>

#include<stdlib.h>

typedef struct node{

int  data;

struct node * next;

}ElemSN;

ElemSN  * Createlink(int a[],int n){ //建立带表头结点的链表

int i;

ElemSN * h, * p;

h=p=(ElemSN *)malloc(sizeof(ElemSN));

h->next=NULL;

for( i=0;i<n;i++){

p=p->next=(ElemSN *)malloc(sizeof(ElemSN));

p->data =a[i];

p->next=NULL;

}

return h;

}

void Fun(ElemSN*head1,ElemSN*head2){

ElemSN*h=NULL,*p,*t,*s;

while(head1->next&&head2->next) {        //任意一条链表为空,循环结束。判断剩余链表的头结点与生成新链表的尾结点的值是否相同,

//相同则free(p),头结点后移

if(head1->next->data<head2->next->data){

p=head1->next;

head1->next=p->next;

}

else{

p=head2->next;

head2->next=p->next;

}

p->next=NULL;

if(!h)

h=t=p;

else{

if(t->data==p->data)

free(p);

else

t=t->next=p;

}

}

if(head1->next)

s=head1->next;

else

s=head2->next;

while(s){

p=s;

s=s->next;

p->next=NULL;

if(p->data==t->data)

free(p);

else

t=t->next=p;

}

head1->next=h;

}

void Printlink(ElemSN * h){

ElemSN * p;

for(p=h;p->next;p=p->next)

printf("%2d\n",p->next->data);

}

int main(void){

int a[9]={1,2,4,4,5,7,7,8,9};

int b[8]={2,3,3,4,10,12,12,13};

ElemSN * head1,*head2;

head1=Createlink(a,9);

head2=Createlink(b,8);

Fun(head1,head2);

free(head2);

Printlink(head1);

}



原文地址:http://blog.51cto.com/13645380/2154814

时间: 2024-10-17 03:00:09

两条带头结点的升序重复合并成一个无重复的升序链表的相关文章

通过另类的泛型约束将两个输入输出参数不同的方法合并成一个方法的实现

其实我也不知道如何定义这个标题,词乏,姑且先这样定义吧. 看了本文章的朋友,如果有更好标题,请告诉我,谢谢. 有个项目使用SDK时遇到这样一个情况. 该SDK有个BtPrinterManager类,拥有两个方法:ServerPrint和ClientPrint,这两个方法有一部分参数是一样的,一部分参数不一样. 现在我们要对这个类进行封装,把这两个方法合并成一个方法,并且使其拥有相同的输入参数和输出参数. 比较粗糙的做法是,把这两个方法的输入参数合并成一个输入模型类,把两个方法的输出参数也合并成一

求全排列(数组有重复元素和数组无重复元素) 回溯 递归

http://www.cnblogs.com/TenosDoIt/p/3662644.html 无重复元素 http://blog.csdn.net/havenoidea/article/details/12838479 有重复元素

两个文本根据索引key关联合并,将无关联信息单独输出

原始两个文本customer.txt:23115823|3115823|aaaaaa|20030819000000|20040420000000|A|CTC-BJ|B23|0|N|0|0 custservice.txt:23115823|fw001|N|1|999912000000|0 脚本执行组合后:23115823~_~23115823~_~aaaaaa~_~20030819000000~_~20040420000000~_~0~_~fw001~_~N~_~1~_~4~_~0 # codin

将两个排好序的序列合并成一个(指针和数组分别实现)

1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 12 List

将两个数组相同index的value合并成一个新的value组成一个新的数组

前提: 这两个数组的长度相同 生成后的新数组长度也相同 返回值都是对象 把rows对象的key和value弄成两个数组, value是一个对象数组 遍历他 给他每一项添加一个新key为name 并把key相对应索引的值附给name 新数组的每一项就多了key为name的成员 原文地址:https://www.cnblogs.com/ll15888/p/11994462.html

sql语句查询表中重复字段以及显示字段重复条数

今天跟大家分享两条SQL语句,是关于查询某表中重复字段以及显示该字段的重复条数. 1.select * from 表名 where 列名 in (select 列名 from 表名 group by 列名 having COUNT(*)>1) order by 列名 运行结果: 注*将表中某列下所有重复的字段查询出来,如果想查询该列中重复条数>=n的话,只需将sql语句中的">1"改为"n-1"即可. 2.select 列名,count(*) CO

c#实现分组服务器,单一无重复生成ID

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 List<Thread> threads = new List<Thread>(); 6 getID(); 7 Console.WriteLine("重复次数:" + ccount); 8 Console.ReadLine(); 9 } 10 11 public static void getID() 12 { 13 for (int j =

LeetCode[3] 无重复字符的最长子串

一道非常老的题目了,看上去很眼熟,但由于自己是个铁憨憨,还是在参考了官方解法后想了很久才把它完成. 惯例先说思路,借助一个hash数组记录上一次出现该字母的位置,两次出现该字母中间的长度就是这一段无重复子串的长度. 举个例子,字符串abcabcbb,第一次出现字母a的位置为0,第二次出现字母a的位置为3,两次出现字母a中间的长度3就是无重复子串abc的长度. 出现重复字母就可以从重复的字母位置开始继续向下探索了,还是以abcabcbb为例,位置3出现重复字母,我们只需从位置3继续向下探索,而不是

hive不同格式数据大小,无重复数据

-- 重点,目标表无重复数据 -- dbName.num_result 无重复记录 -- 插入数据 CREATE TABLE dbName.test_textfile( `key` string, `value` string, `p_key` string, `p_key2` string) STORED AS textfile ; insert overwrite table dbName.test_textfile select * from dbName.num_result where