您的位置:首页 > 其它

14--合并两个排序的链表

2015-09-27 19:05 288 查看
//
//  main.cpp
//  combineSortedList
//
//  Created by Hugo Cao  on 15/7/8.
//  Copyright (c) 2015年 Hugo Cao . All rights reserved.
//

/*
题目:合并两个排序的链表
输入两个递增排序的链表,
合并这两个链表并使链表中的结点仍然是按照递增顺序排列的,

例如 1 3 5 7
2 4 6 8.

测试数据:需要添加 null链表 和 相等的链表

*/

#include <iostream>
using namespace std;

typedef struct ListNode {
int m_value;
ListNode *m_pnext;
} ListNod, *LNode;

//添加结点
LNode addlistNode(int value)
{
LNode pNode = new ListNod();
if (pNode == NULL)
{
cout << "申请失败" << endl;
return NULL;
}
pNode->m_value = value;
pNode->m_pnext = NULL;

return pNode;
}

//链接节点
void connectList(LNode point1, LNode point2)
{
if (point1 != NULL && point2 != NULL)
point1->m_pnext = point2;
}

//创建链表
LNode createListOne()
{
LNode p1 = addlistNode(1);
LNode p2 = addlistNode(3);
LNode p3 = addlistNode(5);
LNode p4 = addlistNode(7);

connectList(p1, p2);
connectList(p2, p3);
connectList(p3, p4);

return p1;
}

LNode createListTwo()
{
LNode p1 = NULL;
//    LNode p1 = addlistNode(1);
//    LNode p2 = addlistNode(3);
//    LNode p3 = addlistNode(5);
//    LNode p4 = addlistNode(7);
//
//    connectList(p1, p2);
//    connectList(p2, p3);
//    connectList(p3, p4);

return p1;
}

//输出列表
void printList(LNode head)
{
cout << "========" << endl;
if (head == NULL)
{
cout << "is empty" << endl;
return ;
}

LNode p1 = head;
while (p1 != NULL) {
cout << p1->m_value << " ";
p1 = p1->m_pnext;
}

cout << endl;
}

//合并两个排序列表
LNode combineSortList(LNode p1, LNode p2)
{
if (p1 == NULL && p2 == NULL)       // 两个链表都为空
{
cout << "链表都为空,无需排序" << endl;
return NULL;
}
if (p1 == NULL && p2 != NULL)       // 其中一个为空
{
return p2;
}
if (p1 != NULL && p2 == NULL)
{
return p1;
}

LNode head = NULL, point = NULL;    //头结点和链接结点
while (p1 != NULL && p2 != NULL)
{
//如果2个链表出现了相同的数字,就去掉一个
if (p1->m_value == p2->m_value)
{
LNode fp = p1;
p1 = p1->m_pnext;
delete fp;
}
//p1,p2都不为空,如果p1 > p2.
if ((p1 != NULL && p2 != NULL) && (p1->m_value > p2->m_value))
{
if (point == NULL)      //当point为空时,就是头结点
{
point = p2;
head = point;
}
else
{
point->m_pnext = p2;
point = p2;
}

p2 = p2->m_pnext;

}
if ((p1 != NULL && p2 != NULL) && (p1->m_value < p2->m_value))
{
if (point == NULL)      //当point为空时,就是头结点
{
point = p1;
head = point;
}
else
{
point->m_pnext = p1;
point = p1;
}

p1 = p1->m_pnext;
}
}

//判断是否有剩余结点,余下全部连接。
if (p1 == NULL && p2 != NULL)
{
point->m_pnext = p2;
}
else if (p2 == NULL && p1 != NULL)
{
point->m_pnext = p1;
}

return head;
}

int main()
{

LNode p1 = createListOne();
LNode p2 = createListTwo();

printList(p1);
printList(p2);

cout << "合并" << endl;

LNode head = combineSortList(p1, p2);
printList(head);

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