剑指offer---合并两个排序的链表

问题合并两个排序的链表

要求:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

 1 struct ListNode {
 2     int val;
 3     struct ListNode *next;
 4     ListNode(int x) :
 5             val(x), next(NULL) {
 6     }
 7 };
 8 
 9 class Solution {
10 public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
12 
13     }
14 };

 思路

 

采用两个指针指向两链表,比较指针节点的大小,值较小的节点肯定需要放到靠前的位置,同时指针指向下一个节点;

解题代码:

递归版:

 1 struct ListNode {
 2     int val;
 3     struct ListNode *next;
 4     ListNode(int x) :
 5             val(x), next(NULL) {
 6     }
 7 };
 8 
 9 class Solution {
10 public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
12         if(pHead1 == nullptr)
13             return pHead2;
14         else if(pHead2 == nullptr)
15             return pHead1;
16         // 两个链表都不为空
17         ListNode *pMerge = nullptr;
18         if(pHead1->val < pHead2->val){
19             pMerge = pHead1;
20             pMerge->next = Merge(pHead1->next, pHead2);
21         }
22         else{
23             pMerge = pHead2;
24             pMerge->next = Merge(pHead1, pHead2->next);
25         }
26         return pMerge;
27     }
28 };

 非递归版:

 1 class Solution {
 2 public:
 3     ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
 4         if(pHead1 == nullptr) return pHead2;
 5         if(pHead2 == nullptr) return pHead1;
 6 
 7         ListNode* pHead = nullptr;
 8         if(pHead1->val < pHead2->val){
 9             pHead = pHead1;
10             pHead1 = pHead1->next;
11         }
12         else{
13             pHead = pHead2;
14             pHead2 = pHead2->next;
15         }
16         ListNode*temp = pHead;
17         // 排序合并,直到较短的链表节点全部遍历完毕
18         while(pHead1 != nullptr && pHead2 != nullptr){
19             if(pHead1->val < pHead2->val){
20                 temp->next = pHead1;
21                 temp = pHead1;
22                 pHead1 = pHead1->next;
23             }
24             else{
25                 temp->next = pHead2;
26                 temp = pHead2;
27                 pHead2 = pHead2->next;
28             }
29         }
30         // 将较长链表的剩余未遍历节点直接连接
31         if(pHead1 == nullptr)
32             temp->next = pHead2;
33         else if(pHead2 == nullptr)
34             temp->next = pHead1;
35         return pHead;
36     }
37 };

 

posted on 2018-10-29 10:42  wangzhch  阅读(232)  评论(0编辑  收藏  举报

导航