第25题:合并两个排序的链表

题目描述

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

 

测试用例

// list1: 1->3->5
// list2: 2->4->6
void Test1()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode6 = CreateListNode(6);

    ConnectListNodes(pNode2, pNode4);
    ConnectListNodes(pNode4, pNode6);

    ListNode* pMergedHead = Test("Test1", pNode1, pNode2);

    DestroyList(pMergedHead);
}

// 两个链表中有重复的数字
// list1: 1->3->5
// list2: 1->3->5
void Test2()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pNode2 = CreateListNode(1);
    ListNode* pNode4 = CreateListNode(3);
    ListNode* pNode6 = CreateListNode(5);

    ConnectListNodes(pNode2, pNode4);
    ConnectListNodes(pNode4, pNode6);

    ListNode* pMergedHead = Test("Test2", pNode1, pNode2);

    DestroyList(pMergedHead);
}

// 两个链表都只有一个数字
// list1: 1
// list2: 2
void Test3()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);

    ListNode* pMergedHead = Test("Test3", pNode1, pNode2);

    DestroyList(pMergedHead);
}

// 一个链表为空链表
// list1: 1->3->5
// list2: 空链表
void Test4()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode3);
    ConnectListNodes(pNode3, pNode5);

    ListNode* pMergedHead = Test("Test4", pNode1, nullptr);

    DestroyList(pMergedHead);
}

// 两个链表都为空链表
// list1: 空链表
// list2: 空链表
void Test5()
{
    ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
}

 

 考点

1.鲁棒性

2.递归:从后往前

3.链表 指针

 

 思路

1.递归结束:如果有一个链表是空,返回另一个链表

2.递归操作:将剩下两个链表最小的头节点作为合并后的头节点;并将 合并后的头节点的下个节点 设置为 剩下链表合并后的头节点。

4.递归返回:合并后的头节点

 第一遍

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
	//1.如果有一个是空链表,返回另外一个
	if (!pHead1)
		return pHead2;
	else if (!pHead2)
		return pHead1;

	//2.定义新链表的头指针
	ListNode* MergeNode = nullptr;

	//3.比较两个链表的头节点大小,进行递归
	if (pHead1->m_nValue <  pHead2->m_nValue)
	{
		//3.1如果链表1的节点小,拿出来,MergeNode->m_pNext进行递归
		MergeNode = pHead1;
		MergeNode->m_pNext = Merge(pHead1->m_pNext, pHead2);

	}
	else
	{
		//3.2如果链表2的节点小,拿出来
		MergeNode = pHead2;
		MergeNode->m_pNext = Merge(pHead1, pHead2->m_pNext);

	}

	//4.返回合并后的链表头指针
	return MergeNode;
}

第二遍

/*
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;
        else if(!pHead2)
            return pHead1;
        
        ListNode* MergeNode=nullptr;
        
        if(pHead1->val<pHead2->val)
        {
            //剩下的两个链表合并后的头节点
            MergeNode=pHead1;
            //将头节点的下一个节点 设置为 剩下两个链表合并的头节点,递归
            MergeNode->next=Merge(pHead1->next,pHead2);
        }
        else 
        {
            MergeNode=pHead2;
            MergeNode->next=Merge(pHead1,pHead2->next);
        }
        
        return MergeNode;
    }
};

 

posted @ 2019-02-07 11:52 lightmare 阅读(...) 评论(...) 编辑 收藏