[剑指offer]合并两个排序的链表

来源:互联网 发布:数控车床编程代码讲解 编辑:程序博客网 时间:2024/06/05 11:57

分析:其实就是mergesort里面的merge,不过换成链表了。这里考虑非递归和递归两种方法

1、非递归

如果某一个链表为空,直接返回另一个链表;

如果当前结果链表为空,则将两个链表指针对应比较小的那个直接赋值给结果链表;

如果当前结果老板不为空,则将当前指针的next指向两个链表指针对应比较小的那个;

最后一个链表遍历结束了,直接把另一个链表的当前指针加到结果链表后面。

/*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* n,*ret=NULL;        ListNode* p=pHead1;        ListNode* q=pHead2;        while(p!=NULL&&q!=NULL){            if(p->val<=q->val){                if(ret==NULL){                    ret=n=p;                }else{                    n->next=p;                    n=n->next;                }                p=p->next;            }            else{                if(ret==NULL){                    ret=n=q;                }else{                    n->next=q;                    n=n->next;                }                q=q->next;                         }        }        if(p!=NULL){            n->next=p;        }        if(q!=NULL){            n->next=q;        }        return ret;    }};

2、非递归

/*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* ret=NULL;        if(pHead1->val<=pHead2->val){            ret=pHead1;            ret->next=Merge(pHead1->next,pHead2);        }        else{            ret=pHead2;            ret->next=Merge(pHead1,pHead2->next);        }        return ret;    }};


0 0
原创粉丝点击