25 合并两个排序的链表

题目

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。

牛客网 OJ
AcWing OJ

C++ 题解

方法一

非递归实现:

/*
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)
            return pHead2;
        if(pHead2  == nullptr)
            return pHead1;
        
        // 表示当前节点
        ListNode* pMergedHead = nullptr;
        // 表示当前的节点,用于串联整个链表
        ListNode* pCurrent = nullptr;
        
        // 当两个链表都非空,则需要一直进行比较取其小者作为当前节点的后继节点
        // 需要注意的是首先应该确定合并后链表的头节点
        while(pHead1 && pHead2)
        {
            if(pHead1->val < pHead2->val)
            {
                if(pMergedHead == nullptr)
                   {
                       pMergedHead = pCurrent = pHead1;
                   }
                else
                   {
                       pCurrent->next = pHead1;
                       pCurrent= pCurrent->next;
                   }
                pHead1 = pHead1->next;
            }
            else
            {
                if(pMergedHead == nullptr)
                   {
                       pMergedHead = pCurrent = pHead2;
                   }
                else
                   {
                       pCurrent->next = pHead2;
                       pCurrent= pCurrent->next;
                   }
                pHead2 = pHead2->next;
            }                
        }
        
        // 跳出while则至少有一个链表已经空了,那么此时需要将另一个非空链表剩余的部分作为当前节点的后继节点
        if(pHead1 == nullptr)
            pCurrent->next = pHead2;
        if(pHead2 == nullptr)
             pCurrent->next = pHead1;
        
        return pMergedHead;        
    }
};

方法二

递归实现:

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
	if (pHead1 == nullptr)
		return pHead2;
	else if (pHead2 == nullptr)
		return pHead1;

	ListNode* pMergedHead = nullptr;

	if (pHead1->m_nValue < pHead2->m_nValue)
	{
		pMergedHead = pHead1;
		pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
	}
	else
	{
		pMergedHead = pHead2;
		pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
	}

	return pMergedHead;
}

python 题解

方法一

非递归实现

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if pHead1 == None:
            return pHead2
        if pHead2 == None:
            return pHead1
        
        pMerged = None
        pCurrent = None
        
        while pHead1 != None and pHead2 != None:
            if pHead1.val < pHead2.val:
                if pMerged == None:
                    pMerged = pCurrent  = pHead1
                else:
                    pCurrent.next = pHead1
                    pCurrent = pCurrent.next
                pHead1 = pHead1.next
            else:
                if pMerged == None:
                    pMerged = pCurrent  = pHead2
                else:
                    pCurrent.next = pHead2
                    pCurrent = pCurrent.next
                pHead2 = pHead2.next
            
        if  pHead1 == None:
            pCurrent.next = pHead2
        if  pHead2 == None:
            pCurrent.next = pHead1
            
        return pMerged

方法二

递归实现:

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if pHead1 == None:
            return pHead2
        if pHead2 == None:
            return pHead1
        
        pMerged = None
        if pHead1.val < pHead2.val:
            pMerged = pHead1
            pMerged.next = self.Merge(pHead1.next,pHead2)
        else:
            pMerged = pHead2
            pMerged.next = self.Merge(pHead1,pHead2.next)
        
        return pMerged
posted @ 2019-01-30 18:55  youngliu91  阅读(136)  评论(0编辑  收藏  举报