剑指offer的66题之第16题:合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
 
代码1:
 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     {
13         ListNode* head=new ListNode(-1);
14         head->next=NULL;
15         ListNode* root=head;
16         while((pHead1!=NULL)&&(pHead2!=NULL))
17         {
18             if(pHead1->val>pHead2->val)
19             {
20                 head->next=pHead2;
21                 head=pHead2;
22                 pHead2=pHead2->next;
23             }
24             else
25             {
26                 head->next=pHead1;
27                 head=pHead1;
28                 pHead1=pHead1->next;
29             }
30         }
31         if(pHead1!=NULL)
32             head->next=pHead1;
33         if(pHead2!=NULL)
34             head->next=pHead2;
35         return root->next;
36         //return head; //返回head是不对的,因为head已经变化了!
37     }
38 };
代码2:
递归
 1 public ListNode Merge(ListNode list1,ListNode list2) {
 2        if(list1 == null){
 3            return list2;
 4        }
 5        if(list2 == null){
 6            return list1;
 7        }
 8        if(list1.val <= list2.val){
 9            list1.next = Merge(list1.next, list2);
10            return list1;
11        }else{
12            list2.next = Merge(list1, list2.next);
13            return list2;
14        }       
15    }

 

注:
1、新建一个头节点,用来存合并的链表:ListNode head=new ListNode(-1);
2、ListNode要根据人家定义的变量,比如是val而不是value:

struct ListNode {
  int val;
  struct ListNode *next;
  ListNode(int x) :
  val(x), next(NULL) {
  }

}
3、注意死循环的条件,用while而不是if
4、传递过来参数ListNode* pHead1,不用判断数据项val是否为空,直接判断pHead1是否为空!
5、注意返回值!return head; //返回head是不对的,因为head已经变化了!
 
posted @ 2018-09-03 16:41  BreakofDawn  阅读(116)  评论(0)    收藏  举报