//
// 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;
}