经典算法学习——合并两个有序链表
2016-08-21 16:59
288 查看
类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型。题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。我这里以合并链表来实现。
在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表。简单的示意图如下:
当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推。直到某一个链表为空时,把另一个链表全部接到Node3之后。注意题目的要求是两个链表都是有序的。完整代码上传至 https://github.com/chenyufeng1991/MergeTwoSortList 。
核心代码如下:
void MergeList(Node *pFirstList, Node *pSecondList, Node **pMergedList)
{
*pMergedList = new Node;
memset(*pMergedList, 0, sizeof(Node));
(*pMergedList)->next = NULL;
Node *pFirstMove = pFirstList->next;
Node *pSecondMove = pSecondList->next;
Node *pMergedMove = *pMergedList;
while (pFirstMove != NULL && pSecondMove != NULL)
{
if (pFirstMove->element <= pSecondMove->element)
{
pMergedMove->next = pFirstMove;
pFirstMove = pFirstMove->next;
}
else
{
pMergedMove->next = pSecondMove;
pSecondMove = pSecondMove->next;
}
pMergedMove = pMergedMove->next;
}
while (pFirstMove != NULL)
{
pMergedMove->next = pFirstMove;
pFirstMove = pFirstMove->next;
pMergedMove = pMergedMove->next;
}
while (pSecondMove != NULL)
{
pMergedMove->next = pSecondMove;
pSecondMove = pSecondMove->next;
pMergedMove = pMergedMove->next;
}
}
在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表。简单的示意图如下:
当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推。直到某一个链表为空时,把另一个链表全部接到Node3之后。注意题目的要求是两个链表都是有序的。完整代码上传至 https://github.com/chenyufeng1991/MergeTwoSortList 。
核心代码如下:
void MergeList(Node *pFirstList, Node *pSecondList, Node **pMergedList)
{
*pMergedList = new Node;
memset(*pMergedList, 0, sizeof(Node));
(*pMergedList)->next = NULL;
Node *pFirstMove = pFirstList->next;
Node *pSecondMove = pSecondList->next;
Node *pMergedMove = *pMergedList;
while (pFirstMove != NULL && pSecondMove != NULL)
{
if (pFirstMove->element <= pSecondMove->element)
{
pMergedMove->next = pFirstMove;
pFirstMove = pFirstMove->next;
}
else
{
pMergedMove->next = pSecondMove;
pSecondMove = pSecondMove->next;
}
pMergedMove = pMergedMove->next;
}
while (pFirstMove != NULL)
{
pMergedMove->next = pFirstMove;
pFirstMove = pFirstMove->next;
pMergedMove = pMergedMove->next;
}
while (pSecondMove != NULL)
{
pMergedMove->next = pSecondMove;
pSecondMove = pSecondMove->next;
pMergedMove = pMergedMove->next;
}
}
相关文章推荐
- 算法学习之旅,初级篇(23)–合并两个有序链表
- 算法学习----合并两个有序的链表
- 经典算法——合并两个有序链表
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- 合并两个有序链表 经典面试题
- 【LeetCode-面试算法经典-Java实现】【021-Merge Two Sorted Lists(合并两个排好序的单链表)】
- 经典算法学习——打印两个链表的第一个公共节点
- [算法学习]合并两个排序的链表
- 算法题:合并两个有序的链表
- 【简单算法】23.合并两个有序链表
- 算法题:合并两个有序的链表
- 经典算法——合并K个有序链表
- 合并两个有序链表 经典面试题
- 两个有序链表合并算法
- 经典算法之两个有序单链表合并
- 数据结构与算法(二)合并两个有序链表
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 算法题:合并两个有序的链表
- 每天一个小算法(2)----合并两个有序链表
- 合并两个有序链表的算法