因为合并后的链表的头结点值为原头结点值较小的链表的首值,因此在头结点值较小的链表上合并,取出另一个链表上结点的值插入到该链表上合适的位置,最后返回头结点值小的链表。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { //只要有一个表为空就返回另一个表头结点 if(!pHead1){ return pHead2; } if(!pHead2){ return pHead1; } ListNode *p1=pHead1,*p2=pHead2,*q1,*q2; //下面几行代码让p1永远指向头结点值较小的链表,并在此链表上合并,最后也是返回头结点值小的链表 bool a=(pHead1->val<pHead2->val)?1:0; if(a){ p1=pHead1;p2=pHead2; } else{ p1=pHead2;p2=pHead1; } //合并链表,因为需要用p1与p1->next的值夹比,p1所指链表循环终止条件为p1->next==NULL while(p1->next && p2){ if(p1->val<=p2->val && p1->next->val>=p2->val){ q1=p1->next; q2=p2; while(q2->next && p1->next->val>q2->next->val){//一口气插入范围内值的所有结点 q2=q2->next; } p1->next=p2; p2=q2->next; q2->next=q1; p1=q1; } else{ p1=p1->next; } } if(p2){//连接剩余的链表 p1->next=p2; } return (a==1)?pHead1:pHead2; } };