合并两个有序的单链表
2017-08-22 23:29
381 查看
题目:合并两个递增的单链表,使合并后的新链表中的节点依然是按照递增排序的。链表结点定义如下:
struct ListNode
{
int val;
ListNode next;
};
分析:我们从链表头结点开始分析,如果链表1头结点的值小于链表2头结点的值,那么链表1的头结点就是合并后新链表的头结点。
我们继续合并两个链表中剩余的结点,依旧是比较两个链表头结点的值,找出小的那个连接到合并后新链表的尾部。
我们发现合并的步骤都是一样的,所以这是一个递归的过程。
注意:我们要注意链表为空时的处理方式,如果一个链表为空,那它和另一个链表合并之后的结果就是另外那个链表。如果两个链表都是空链表,那么合并后依旧是空链表。
过程用图表示:
最后附上代码:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
if(pHead1 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
ListNode* MergeNode = NULL;
if(pHead1->val < pHead2->val){
MergeNode = pHead1;
MergeNode->next = Merge(pHead1->next, pHead2);
}
else{
MergeNode = pHead2;
MergeNode->next = Merge(pHead1, pHead2->next);
}
return MergeNode;
}
struct ListNode
{
int val;
ListNode next;
};
分析:我们从链表头结点开始分析,如果链表1头结点的值小于链表2头结点的值,那么链表1的头结点就是合并后新链表的头结点。
我们继续合并两个链表中剩余的结点,依旧是比较两个链表头结点的值,找出小的那个连接到合并后新链表的尾部。
我们发现合并的步骤都是一样的,所以这是一个递归的过程。
注意:我们要注意链表为空时的处理方式,如果一个链表为空,那它和另一个链表合并之后的结果就是另外那个链表。如果两个链表都是空链表,那么合并后依旧是空链表。
过程用图表示:
最后附上代码:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
if(pHead1 == NULL)
return pHead2;
if(pHead2 == NULL)
return pHead1;
ListNode* MergeNode = NULL;
if(pHead1->val < pHead2->val){
MergeNode = pHead1;
MergeNode->next = Merge(pHead1->next, pHead2);
}
else{
MergeNode = pHead2;
MergeNode->next = Merge(pHead1, pHead2->next);
}
return MergeNode;
}
相关文章推荐
- PAT1017. 两个有序链表序列的合并(15)
- 5-51 两个有序链表序列的合并(Java)
- 实例2.1 两个有序链表序列的合并
- 将两个递增有序的带头结点的单链表A、B合并成为一个递增有序的带头结点的单链表
- 对两个有序的链表进行合并成一个一个有序链表(递归方法)
- 21. 合并两个有序链表
- 合并两个有序单链表,使得合并后的链表仍然有序
- 5-51 两个有序链表序列的合并
- 把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表
- 将两个递增的有序链表合并,不分配额外的空间
- 合并两个有序链表
- LeetCode - 21. 合并两个有序链表
- 将两个有序链表合并成一个有序链表
- C++算法之 合并两个有序链表
- 两个有序链表序列的合并
- 7-15 两个有序链表序列的合并(20 分)
- [LeetCode-21] Merge Two Sorted Lists(合并两个有序链表)
- 面试题17:合并两个有序链表(Leetcode-21:Merge Two Sorted Lists)
- 合并两个有序的链表
- 【链表】合并两个有序链表,合并后链表依旧有序