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

面试题17:合并两个排序的链表

2015-05-30 14:44 465 查看
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

非递归:

/*第一种方法:非递归*/
struct ListNode
{
int value;
ListNode * m_pNext;
};

ListNode * MergeTwoList(ListNode * pListOneHead, ListNode * pListTwoHead)
{
//如果第一个链表为空,则第二个链表的头结点是合并后的头结点
if(pListOneHead==NULL)
{
return pListTwoHead;
}
//如果第二个链表为空,则第一个链表的头结点是合并后的头结点
if(pListTwoHead==NULL)
{
return pListOneHead;
}

//合并后的头结点
ListNode * pMergeHead=NULL;
ListNode * nodeOne=pListOneHead;
ListNode * nodeTwo=pListTwoHead;
ListNode * curLastNode=NULL;//记录当前结点的上一个结点

//如果第一个链表的头结点的值小于第二个链表的,将链表一的头结点设为合并后的头结点
if(nodeOne->value < nodeTwo->value)
{
pMergeHead=pListOneHead;
//记录当前结点
curLastNode=nodeOne;
//当前结点指向下一个结点
nodeOne=nodeOne->m_pNext;
}
else
{
pMergeHead=pListTwoHead;
//记录当前结点
curLastNode=nodeTwo;
//当前结点指向下一个结点
nodeTwo=nodeTwo->m_pNext;
}

while(nodeOne!=NULL&&nodeTwo!=NULL)
{
//如果第一个链表的结点的值小于第二个链表的
if(nodeOne->value < nodeTwo->value)
{
//将当前结点接入合并后的链表
curLastNode->m_pNext=nodeOne;
//记录当前结点
curLastNode=nodeOne;
//当前结点指向下一个结点
nodeOne=nodeOne->m_pNext;
}
else
{
//将当前结点接入合并后的链表
curLastNode->m_pNext=nodeTwo;
//记录当前结点
curLastNode=nodeTwo;
//当前结点指向下一个结点
nodeTwo=nodeTwo->m_pNext;
}
//如果链表一遍历完毕,将链表二全部接入合并后的链表
if(nodeOne==NULL)
{
curLastNode->m_pNext=nodeTwo;
}
if(nodeTwo==NULL)
{
curLastNode->m_pNext=nodeOne;
}
}
return pMergeHead;

}


递归:

struct ListNode
{
int m_nValue;
ListNode *m_pNext;
};

//合并两个有序链表,递归方法
ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead)
{
if (pListOneHead == NULL)
{
return pListTwoHead;
}

if (pListTwoHead == NULL)
{
return pListOneHead;
}

ListNode *pMergeListHead = NULL;

if (pListOneHead->m_nValue < pListTwoHead->m_nValue)
{
pMergeListHead = pListOneHead;
pMergeListHead->m_pNext = MergeTwoList(pMergeListHead->m_pNext, pListTwoHead);
}
else
{
pMergeListHead = pListTwoHead;
pMergeListHead->m_pNext = MergeTwoList(pListOneHead, pMergeListHead->m_pNext);
}

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