zoukankan      html  css  js  c++  java
  • 合并两个链表的问题

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
    
    #define N 10
    
    typedef struct Node
    {
    	int data;
    	struct Node *next;
    }Node, *pNode;
    
    /*顺序插入法*/
    void create_list_sequence(pNode *h)
    {
    	pNode p, q, r=NULL;
    	p = q = *h = (pNode)calloc(1,sizeof(Node));
    	p->next = NULL;
    	int count = 0;
    	while (count != N){
    		++count;
    		if (count == 1){
    			p->data = rand()%100;
    			//printf("%d ", p->data);
    		}
    		else{			
    			r = (pNode)calloc(1,sizeof(Node));
    			r->data = rand() % 100;
    			//printf("%d ", r->data);
    			p = q = *h;
    			while (p ->next != NULL && p->data < r->data ){
    				q = p;
    				p = p->next;
    			}
    			if (p->data >= r->data){
    				if (p == q){
    					r->next = *h;
    					*h = r;
    				}
    				else {
    					r->next = p;
    					q->next = r;
    				}
    			}
    			else{
    				p->next = r;
    				r->next = NULL;
    			}
    		}
    	}
    	printf("
    ");
    }
    
    /*方法一:在这个合并俩链表的程序中,除了刚開始,pa1,pa2始终是一前一后,pb1和pb2始终
    
    是b中当前所剩节点的头节点*/
    void mergeTwoList(pNode *h1, pNode *h2)
    {
    	pNode pa1, pa2, pb1, pb2;
    	pa1 = pa2 = *h1;
    	pb1 = pb2 = *h2;
    	while (pa1 != NULL&&pb1 != NULL){/*当两个链表当中不论什么一个遍历结束,
    
    就退出循环*/
    		while (pb1->data > pa1->data && pa1->next != NULL){/*找到a
    
    链表中不小于b链表中元素的元素,假设一直没有,则到a中的最后一个元素为止*/
    			pa2 = pa1;
    			pa1 = pa1->next;
    		}
    		if (pa1->data >= pb1->data){/*找到了a链表中不小于b链表中元
    
    素的元素*/
    			if (pa1 == pa2){/*假设是a聊表的第一个元素,就把a链
    
    表的头指针指向b链表的第一个节点*/
    				*h1 = pb1;
    			}
    			else{
    				pa2->next = pb1;/*假设不是a链表中的第一个元
    
    素,则让a链表当前节点的上一个节点指向b当前节点*/
    			}
    			pb1 = pb1->next;/*将b1向后移动一个位子。为pb2指向
    
    pa1,从而防止会和b表中下一个节点失去联系*/
    			pb2->next = pa1;
    			pa2 = pb2;
    			pb2 = pb1;
    		}else{
    			pa2 = pa1;/*假设a当前元素比b小。且是a中最后一个元素
    
    。就往后移动,事实上就会运行一次,仅仅是是为了解决死循环问题*/
    			pa1 = pa1->next;
    		}
    	}
    	if (pa1 == NULL && pb1 != NULL){
    		pa2->next = pb1;
    	}
    }
    
    void mergeTwoList_test()
    {
    	pNode Link1, Link2;
    	create_list_sequence(&Link1);
    	create_list_sequence(&Link2);
    	printf("Link1:
    ");
    	printList(Link1);
    	printf("Link2:
    ");
    	printList(Link2);
    	mergeTwoList(&Link1, &Link2);
    	printf("After merge:
    ");
    	printList(Link1);
    }
    
    /*方法二:*/
    
    void mergeTwoList_solution2(pNode *h1,pNode *h2)
    {
    	pNode pa1, pa2, pb1, pb2;
    	pa1 = pa2 = *h1;
    	pb1 = pb2 = *h2;
    	while (pa1 != NULL && pb1 != NULL){
    		if (pa1->data > pb1->data){
    			if (pa1 == pa2){
    				*h1 = pb1;
    				pa2 = pb1;
    			}
    			else{
    				pa2->next = pb1;
    				pa2 = pa2->next;
    				pb1 = pb1->next;
    			}
    		}
    		else if (pa1->data < pb1->data){
    			if (pa1 != pa2){
    				pa2->next = pa1;
    				pa2 = pa2->next;
    			}		
    			pa1 = pa1->next;
    		}
    		else if (pa1->data == pb1->data){
    			if (pa1 != pa2){
    				pa2->next = pa1;
    				pa2 = pa2->next;
    			}			
    			pa1 = pa1->next;
    			pa2->next = pb1;
    			pa2 = pa2->next;
    			pb1 = pb1->next;
    		}	
    	}
    	if (pa1 == NULL){
    		pa2->next = pb1;
    	}
    	if (pb1 == NULL){
    		pa2->next = pa1;
    	}
    }
    
    
    int main()
    {
    	mergeTwoList_test();
    	return 0;
    }
    

  • 相关阅读:
    IntelliJ IDEA插件-常用插件
    Java代码规范和质量检查插件-Checkstyle(官方资源)
    Google代码风格配置文件(Java)(IDEA/Eclipse)
    Java中常量定义在interface和class的区别(转)
    Mac下安装Iterm2终端工具
    Ubuntu 16.04安装IntelliJ出品的数据库管理工具DataGrip
    Ubuntu 16.04安装JAD反编译工具(Java)
    Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别
    微信开发(一)基于Wx-java的微信分享功能
    spring@value取不到值的几种情况
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6776156.html
Copyright © 2011-2022 走看看