题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。
#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;
}