25 合并两个排序的链表
题目
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。
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