LeetCodeAnimation/notes/LeetCode第21号问题:合并两个有序链表.md

107 lines
3.7 KiB
Java
Raw Normal View History

2019-05-02 15:59:01 +08:00
# LeetCode 21 号问题合并两个有序链表
> 本文首发于公众号五分钟学算法[图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>)系列文章之一。
>
> 个人网站[https://www.cxyxiaowu.com](https://www.cxyxiaowu.com)
题目来源于 LeetCode 上第 21 号问题合并两个有序链表题目难度为 Easy目前通过率为 45.8%
### 题目描述
将两个有序链表合并为一个新的有序链表并返回新链表是通过拼接给定的两个链表的所有节点组成的
**示例**
```
输入1->2->4, 1->3->4
输出1->1->2->3->4->4
```
### 题目解析
#### 一般方案
##### 1.1 解题思想
> 1对空链表存在的情况进行处理假如 pHead1 为空则返回 pHead2 pHead2 为空则返回 pHead1两个都为空此情况在pHead1为空已经被拦截
> 2在两个链表无空链表的情况下确定第一个结点比较链表1和链表2的第一个结点的值将值小的结点保存下来为合并后的第一个结点并且把第一个结点为最小的链表向后移动一个元素
> 3继续在剩下的元素中选择小的值连接到第一个结点后面并不断next将值小的结点连接到第一个结点后面直到某一个链表为空
> 4当两个链表长度不一致时也就是比较完成后其中一个链表为空此时需要把另外一个链表剩下的元素都连接到第一个结点的后面
##### 1.2 代码实现
```c++
ListNode* mergeTwoOrderedLists(ListNode* pHead1, ListNode* pHead2){
ListNode* pTail = NULL;//指向新链表的最后一个结点 pTail->next去连接
ListNode* newHead = NULL;//指向合并后链表第一个结点
if (NULL == pHead1){
return pHead2;
}else if(NULL == pHead2){
return pHead1;
}else{
//确定头指针
if ( pHead1->data < pHead2->data){
newHead = pHead1;
pHead1 = pHead1->next;//指向链表的第二个结点
}else{
newHead = pHead2;
pHead2 = pHead2->next;
}
pTail = newHead;//指向第一个结点
while ( pHead1 && pHead2) {
if ( pHead1->data <= pHead2->data ){
pTail->next = pHead1;
pHead1 = pHead1->next;
}else {
pTail->next = pHead2;
pHead2 = pHead2->next;
}
pTail = pTail->next;
}
if(NULL == pHead1){
pTail->next = pHead2;
}else if(NULL == pHead2){
pTail->next = pHead1;
}
return newHead;
}
```
#### 2 递归方案
##### 2.1 解题思想
> 1对空链表存在的情况进行处理假如 pHead1 为空则返回 pHead2 pHead2 为空则返回 pHead1
> 2比较两个链表第一个结点的大小确定头结点的位置
> 3头结点确定后继续在剩下的结点中选出下一个结点去链接到第二步选出的结点后面然后在继续重复2 3 直到有链表为空
##### 2.2 代码实现
```c++
ListNode* mergeTwoOrderedLists(ListNode* pHead1, ListNode* pHead2){
ListNode* newHead = NULL;
if (NULL == pHead1){
return pHead2;
}else if(NULL ==pHead2){
2019-05-22 17:14:47 +08:00
return pHead1;
2019-05-02 15:59:01 +08:00
}else{
if (pHead1->data < pHead2->data){
newHead = pHead1;
newHead->next = mergeTwoOrderedLists(pHead1->next, pHead2);
}else{
newHead = pHead2;
newHead->next = mergeTwoOrderedLists(pHead1, pHead2->next);
}
return newHead;
}
}
```
###
![](https://bucket-1257126549.cos.ap-guangzhou.myqcloud.com/blog/fz0rq.png)