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

题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
这题说明自己对链表还是不熟悉。
 
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
12         if(pHead1 == nullptr && pHead2 == nullptr){
13             return nullptr;
14         }
15         if(pHead1 == nullptr){
16             return pHead2;
17         }
18         if(pHead2 == nullptr){
19             return pHead1;
20         }
21         ListNode* pHead = new ListNode(0);
22         ListNode* head = pHead;
23         
24         while(pHead1 != nullptr && pHead2 != nullptr){
25             if(pHead1 -> val < pHead2 -> val){
26                 pHead -> next= pHead1;
27                 pHead1 = pHead1 -> next;
28             }
29             else{
30                 pHead -> next = pHead2;
31                 pHead2 = pHead2 -> next;
32             }
33             
34             pHead = pHead -> next;
35         }
36         if(pHead1 != nullptr){
37             pHead -> next = pHead1;
38         }
39         if(pHead2 != nullptr){
40             pHead -> next = pHead2;
41         }
42         return head -> next;
43     }
44 };

开始自己写的时候,将

while(pHead1 != nullptr && pHead2 != nullptr){
            if(pHead1 -> val < pHead2 -> val){
                pHead = pHead1;
                pHead1 = pHead1 -> next;
            }
            else{
                pHead = pHead2;
                pHead2 = pHead2 -> next;
            }
            
            pHead = pHead -> next;
        }

这样并没有改变结果,相当于将head指向了pHead1,并没有改变原来的指向关系。只有 p = p -> next,才能改变指向关系。新建一个dummy node 节点,可以避免很多麻烦的事情。

 

 
 
posted @ 2017-09-02 19:47  zqlucky  阅读(127)  评论(0编辑  收藏  举报