3.剑指offer-合并两个有序的链表

来源:互联网 发布:图片软件排行 编辑:程序博客网 时间:2024/05/21 22:29

1.题目要求

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。要求辅助空间是O(1)

2. 想法

假设两个链表的头指针分别是pHead1和pHead2.

基本想法是:用一个指针p指向合成链表的尾节点,p1指向pHead1链表中等待比较的节点,p2指向pHead2链表中等待比较的节点,那么每一次比较p1指向的节点和p2指向的节点的大小,继而决定谁先进入新合成的链表。

3.代码(只是部分代码)

/*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==NULL)             return pHead2;        if(pHead2==NULL)            return pHead1;        ListNode *p,*Head,*p1,*p2,*p3;        if(pHead1->val<=pHead2->val){            Head=pHead1;            p1=pHead1->next;            p2=pHead2;            p=Head;        }else{            Head=pHead2;            p1=pHead1;            p2=pHead2->next;            p=Head;        }        while(p1!=NULL && p2!=NULL){            if(p1->val<=p2->val){                p3=p1->next;                p->next=p1;                p1=p3;                p=p->next;            }else{                p3=p2->next;                p->next=p2;                p2=p3;                p=p->next;            }          }        if(p1==NULL){            p->next=p2;        }else{            p->next=p1;        }        return Head;    }};
0 0