【剑指Offer-代码的鲁棒性】面试题25:合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路1

可以使用循环来做。首先要确定合并后链表的头。如果第一个链表为空,则合并后的链表就是第二个链表;同样地,如果第二个链表为空,则合并后的链表就是第一个链表;如果两个链表均不为空,则合并后的链表头为两个链表头结点中值较小的那个。确定表头后,可以对两个链表进行遍历:设cur1为第一个链表的当前结点,cur2为第二个链表的当前结点,如果cur1->val>cur2<val,则将cur2加入到链表中; 否则将cur1加入到链表中。直至两个链表都遍历结束。代码如下:

/*
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==nullptr && pHead2==nullptr)
            return nullptr;
        
        ListNode* pHead3;    //合并后的链表头
        ListNode* cur1 = pHead1;
        ListNode* cur2 = pHead2;
        if(cur1!=nullptr&&cur2!=nullptr)    //确定pHead3
        {
            if(cur1->val>cur2->val)
            {
                pHead3 = cur2;
                cur2 = cur2->next;
            }
            else if(cur1->val<cur2->val)
            {
                pHead3 = cur1;
                cur1 = cur1->next;
            }
            else
            {
                pHead3 = cur1;
                cur1 = cur1->next;
            }
        }
        else if(cur1==nullptr&&cur2!=nullptr)
        {
            pHead3 = cur2;
            cur2 = cur2->next;
        }
        else if(cur1!=nullptr&&cur2==nullptr)
        {
            pHead3 = cur1;
            cur1 = cur1->next;
        }
        ListNode* cur = pHead3;
        
        while(cur1!=nullptr||cur2!=nullptr)    //合并两个链表
        {
            if(cur1!=nullptr&&cur2!=nullptr)
            {
                if(cur1->val>cur2->val)
                {
                    cur->next = cur2;
                    cur = cur->next;
                    cur2 = cur2->next;
                }
                else if(cur1->val<cur2->val)
                {
                    cur->next = cur1;
                    cur = cur->next;
                    cur1 = cur1->next;
                }
                else
                {
                    cur->next = cur1;
                    cur = cur->next;
                    cur1 = cur1->next;
                }
             }
             else if(cur1==nullptr&&cur2!=nullptr)
             {
                 while(cur2!=nullptr)
                 {
                     cur->next = cur2;
                     cur = cur->next;
                     cur2 = cur2->next;
                 }
             }
             else if(cur1!=nullptr&&cur2==nullptr)
             {
                 while(cur1!=nullptr)
                 {
                     cur->next = cur1;
                     cur = cur->next;
                     cur1 = cur1->next;
                 }
             }
        }
        return pHead3;
    }
};

思路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==nullptr && pHead2==nullptr)
            return nullptr;
        
        if(pHead1==nullptr)
            return pHead2;
        if(pHead2==nullptr)
            return pHead1;
        
        if(pHead1->val>pHead2->val)
        {
            pHead2->next = Merge(pHead1, pHead2->next);
            return pHead2;
        }
        else
        {
            pHead1->next = Merge(pHead1->next, pHead2);
            return pHead1;
        }
    }
};
posted @ 2020-03-09 21:27  Flix  阅读(117)  评论(0编辑  收藏  举报