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

【面试题17】将两个有序的链表合并

2015-09-14 22:00 519 查看
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {}//成员中有指针,一定要重载构造函数
ListNode(){}//保留默认构造函数
};

//创建一个链表结点
ListNode* CreateListNode(int value)
{
ListNode *pNode = new ListNode();
pNode->val = value;
pNode->next = NULL;
return pNode;
}

//往链表末尾添加结点
/*
注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。
因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。
*/
void AddToTail(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode();//新插入的结点
pNew->val = value;
pNew->next = NULL;

if (*pHead == NULL)//空链表
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while (pNode->next != NULL)
pNode = pNode->next;
pNode->next = pNew;
}

}

//遍历链表中的所有结点
void PrintList(ListNode* pHead)
{
ListNode *pNode = pHead;
while (pNode != NULL)
{
cout << pNode->val << " ";
pNode = pNode->next;
}
cout << endl;
}

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if (pHead1 == NULL&&pHead2 == NULL)
return NULL;
else if (pHead1 == NULL&&pHead2 != NULL)
return pHead2;
else if (pHead1 != NULL&&pHead2 == NULL)
return pHead1;
else
{
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
ListNode *pHead = NULL;
if (p1->val>p2->val)
{
pHead = p2;
p2 = p2->next;
}
else
{
pHead = p1;
p1 = p1->next;
}
ListNode *p = pHead;
while (p1 != NULL&&p2 != NULL)
{
if (p1->val>p2->val)
{
p->next = p2;
p = p2;
p2 = p2->next;
}
else
{
p->next = p1;
p = p1;
p1 = p1->next;
}
}

while (p1 != NULL)
{
p->next = p1;
p = p1;
p1 = p1->next;
}

while (p2 != NULL)
{
p->next = p2;
p = p2;
p2 = p2->next;
}
return pHead;
}
}

void main()
{
//创建结点
ListNode* pNode1 = CreateListNode(1);//创建一个结点
ListNode* pNode2 = CreateListNode(2);//创建一个结点

//往链表中添加新结点
AddToTail(&pNode1, 3);
AddToTail(&pNode2, 4);
AddToTail(&pNode1, 5);
AddToTail(&pNode2, 6);
/*AddToTail(&pNode1, 7);
AddToTail(&pNode2, 8);*/

ListNode* p = Merge(pNode1, pNode2);

PrintList(p);//打印

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: