您的位置:首页 > 职场人生

【剑指offer】面试题17、合并两个排序的链表

2015-06-20 14:08 731 查看
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中的链表 1 和链表 2,则合并之后的升序链表如链表 3 所示。链表结点定义如下:
typedef struct Node
{
int m_nValue;
struct Node *m_pNext;
}ListNode;


#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define N 10

typedef struct Node
{
int m_nValue;
struct Node *m_pNext;
}ListNode, *pListNode;

// 创建有序链表
void createOrderedList(ListNode **pHead, int len)
{
while(len--)
{
ListNode *pNew = (ListNode*)malloc(sizeof(ListNode));
pNew->m_nValue = rand()%100;
pNew->m_pNext = NULL;

if(*pHead == NULL) // 空
*pHead = pNew;
else //非空
{
ListNode *pNode = *pHead;
ListNode *pPre = NULL;
while(pNode != NULL)
{
if(pNode->m_nValue < pNew->m_nValue)
{
pPre = pNode;
pNode = pNode->m_pNext;
}
else
break;
}
// 插入的位置
if(pPre == NULL) // 头结点位置
{
pNew->m_pNext = *pHead;
*pHead = pNew;
}
else // 其他位置
{
pNew->m_pNext = pNode;
pPre->m_pNext = pNew;
}
}
}
}

void printList(ListNode *pHead)
{
while(pHead != NULL)
{
printf("%3d ", pHead->m_nValue);
pHead = pHead->m_pNext;
}
printf("\n");
}

// 合并有序链表
ListNode *Merge(ListNode *leftHead, ListNode *rightHead)
{
if(!leftHead)
return rightHead;
else if(!rightHead)
return leftHead;

ListNode *mergeHead, *mergeTail;
mergeHead = mergeTail = NULL;
ListNode *pLeft = leftHead;
ListNode *pRight = rightHead;
while(pLeft != NULL && pRight != NULL)
{
if(pLeft->m_nValue < pRight->m_nValue) // 左链表结点值比右链表结点值大
{
if(mergeHead == NULL) // 头结点
{
mergeHead = mergeTail = pLeft;
}
else // 非头结点
{
mergeTail->m_pNext = pLeft;
mergeTail = pLeft;
}
pLeft = pLeft->m_pNext;
}
else// 右链表结点值比左链表结点值大
{
if(mergeHead == NULL) // 头结点
{
mergeHead = mergeTail = pRight;
}
else // 非头结点
{
mergeTail->m_pNext = pRight;
mergeTail = pRight;
}
pRight = pRight->m_pNext;
}

}

if(pLeft != NULL)
mergeTail->m_pNext = pLeft;
if(pRight != NULL)
mergeTail->m_pNext = pRight;

return mergeHead;
}

int main(int argc, char const *argv[])
{
srand(time(NULL));

ListNode *pHead1 = NULL;
ListNode *pHead2 = NULL;

createOrderedList(&pHead1, N);
printf("List1: ");
printList(pHead1);

createOrderedList(&pHead2, N);
printf("List2: ");
printList(pHead2);

ListNode *pMergeHead = Merge(pHead1, pHead2);
if(pMergeHead != NULL)
{
printf("The Merge Node: %d\n", pMergeHead->m_nValue);
}
printf("MergedList: ");
printList(pMergeHead);

return 0;
}


View Code

本文完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: