剑指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已经变化了!

浙公网安备 33010602011771号