合并两个排序的列表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
/**
*将两个分别排序的链表合成一个排序链表
*
**/
struct ListNode {
     int m_nKey;
     ListNode* m_pNext;
};
void Print (ListNode* pHead) {
	if (NULL == pHead) {
		printf("List is NULL\n");
		return;
	}
	ListNode* pNode = pHead;
	while (pNode) {
		printf("%d ",pNode->m_nKey);
		pNode = pNode->m_pNext;
	}
	printf("\n");
}
ListNode* Initial (int size) {
	if ( 0 >= size) {
		return NULL;
	}
	int i = 0;
	ListNode* pNode;
	ListNode* preNode;
	ListNode* pHead = (ListNode*) malloc(sizeof(ListNode));
	int value = rand() % 10;
        pHead->m_nKey = value;
	pHead->m_pNext = NULL;
	i++;
	preNode = pHead;
	for (;i<size;i++) {
		pNode = (ListNode*)malloc(sizeof(ListNode));
		value += rand() % 10;
		pNode->m_nKey = value ;
		pNode->m_pNext = NULL;
		preNode->m_pNext = pNode;
		preNode = pNode;
	}
	return pHead;
}
ListNode* Merge (ListNode* ListA, ListNode* ListB) {
	if (NULL == ListA) {
		return ListB;
	}
	if (NULL == ListB) {
		return ListA;
	}
	ListNode* pHead ;
	ListNode* nextNodeA;
	ListNode* nextNodeB;
	ListNode* preNodeA;
	ListNode* preNodeB;
        if (ListA->m_nKey <= ListB->m_nKey) {
		pHead = ListA;
		preNodeA = ListA;
		preNodeB = ListB;
	}
	else {
		pHead = ListB;
		preNodeA = ListB;
		preNodeB = ListA;
	}
	while (preNodeB) {
		nextNodeA = preNodeA->m_pNext;
		while (nextNodeA && nextNodeA->m_nKey <= preNodeB->m_nKey) {
			preNodeA = nextNodeA;
			nextNodeA = preNodeA->m_pNext;
		}
        	if (NULL == nextNodeA) {
			preNodeA->m_pNext = preNodeB;
			return pHead;
		}
		preNodeA->m_pNext = preNodeB;
		preNodeA = preNodeA->m_pNext;
        	preNodeB = nextNodeA;
		nextNodeA = preNodeA->m_pNext;
        }
	return pHead;
}
int main() {
   ListNode* ListA;
   ListNode* ListB;
   ListNode* pHead;
   printf("Input list size:\n");
   int n,m;
   scanf("%d,%d,",&n,&m);
   ListA = Initial(n);
   ListB = Initial(m);
   printf("Initial list is :\n");
   Print(ListA);
   Print(ListB);
   pHead = Merge(ListA, ListB);
   printf("after rever list is :\n");
   Print(pHead);
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值