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

题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
 
解题思路:
1)定义一个头指针head,定义pNode为当前操作结点
2)判断链表1和链表2,将小的连接在pNode->next上,然后pNode = pNode->next
3)将剩下的非空链表链接上
4)返回head->next
  1 #include <iostream>
  2 #include <malloc.h>
  3 using namespace std;
  4 struct ListNode {
  5     int val;
  6     struct ListNode *next;
  7     ListNode(int x) :
  8             val(x), next(NULL) {
  9     }
 10 };
 11 class Solution {
 12 public:
 13     ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
 14     {
 15         ListNode *head = new ListNode(-1);//头指针
 16         ListNode *pNode = head;//当前操作结点
 17         while(pHead1 != NULL && pHead2 != NULL)
 18         {
 19             if(pHead1->val <= pHead2->val)//小的链接在链表上
 20             {
 21                 pNode->next = pHead1;
 22                 pNode= pNode->next;
 23                 pHead1 = pHead1->next;
 24             }
 25             else
 26             {
 27                 pNode->next = pHead2;
 28                 pNode = pNode->next;
 29                 pHead2 = pHead2->next;
 30             }
 31         }
 32         //剩余的非空链表全部链接上
 33         while(pHead1 != NULL)
 34         {
 35             pNode->next = pHead1;
 36             pNode= pNode->next;
 37             pHead1 = pHead1->next;
 38         }
 39         while(pHead2 != NULL)
 40         {
 41             pNode->next = pHead2;
 42             pNode= pNode->next;
 43             pHead2 = pHead2->next;
 44         }
 45         return head->next;
 46     }
 47 };
 48 ListNode *CreateList(int n)
 49 {
 50     ListNode *head;
 51     ListNode *p,*pre;
 52     int i;
 53     head=(ListNode *)malloc(sizeof(ListNode));
 54     head->next=NULL;
 55     pre=head;
 56     for(i=1;i<=n;i++)
 57     {
 58         p=(ListNode *)malloc(sizeof(ListNode));
 59         cin>>p->val;
 60         pre->next=p;
 61         pre=p;
 62     }
 63     p->next=NULL;
 64 
 65     return head->next;
 66 }
 67 /*-------------------------输出链表-----------------------------------*/
 68 void PrintList(ListNode *h)
 69 {
 70     ListNode *p;
 71 
 72     p=h;//不带空的头结点
 73     while(p)
 74     {
 75         cout<<p->val<<" ";
 76         p=p->next;
 77         cout<<endl;
 78     }
 79 }
 80 int main()
 81 {
 82     int n1;
 83     int n2;
 84     ListNode *h1;
 85     ListNode *h2;
 86     ListNode *h;
 87     cout<<"输入链表1的结点数目"<<endl;
 88     cin>>n1;
 89     h1 = CreateList(n1);
 90     cout<<"链表1为:"<<endl;
 91     PrintList(h1);
 92     cout<<"输入链表2的结点数目"<<endl;
 93     cin>>n2;
 94     h2 = CreateList(n2);
 95     cout<<"链表2为:"<<endl;
 96     PrintList(h2);
 97     Solution s;
 98     h = s.Merge(h1,h2);
 99     cout<<"合并后链表为: "<<endl;
100     PrintList(h);
101     return 0;
102 }

posted @ 2017-05-16 10:21  qqky  阅读(165)  评论(0编辑  收藏  举报