本题来自《剑指offer》 合并两个排序的链表
题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
A:采用递归的方式(C++ Code)
在各链不为空的情况下,比较各头结点的大小,将其作为头结点,之后递归调用。
B:采用循环的方式(Python Code)
需要考虑较为多的因素,代码的鲁棒性是否为空或者只有一个节点。
C++ Code:(递归)
/*
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){ //如果1为空,则直接返回2
return pHead2;
}else if(!pHead2){ //如果2为空,则直接返回1
return pHead1;
}
ListNode* MergeNode = NULL;
if (pHead1->val < pHead2->val){ //如果第一个链的头结点小于第二个
MergeNode = pHead1; //则合并的头结点为第一个的头结点
MergeNode->next = Merge(pHead1->next,pHead2); //递归调用下个
}else{
MergeNode = pHead2; //如果第一个链大于或者等于第二的头结点
MergeNode->next = Merge(pHead1,pHead2->next); //则递归调用
}
return MergeNode; //最终返回合并的头结点
}
};
Python Code:(循环方式)
# -*- 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: #如果1链的头结点为空,则直接返回2
return pHead2
if pHead2 == None: #如果2链的头结点为空,则直接返回1
return pHead1
'''
首先处理头部分,将两个值的最小作为结果链表的头
'''
if pHead1.val < pHead2.val: #如果1的头结点值小于2头结点的值
head = pHead1 #合并链的头结点是1的头结点
pHead1 = pHead1.next #则将节点后移
else:
head = pHead2 #否则为2为头结点(大于或者等于)
pHead2 = pHead2.next
temp = head #临时变量,为保存下一个节点
'''
其次处理链表只有一个节点的情况,在上面步骤后将那个大的节点挂载到后面的节点中
'''
if pHead1 == None :
temp.next = pHead2
if pHead2 == None:
temp.next = pHead1
while pHead1 and pHead2: #这种情况在各个链表的节点多余两个以上时,并且不为空
if pHead1.val < pHead2.val: #同理将各个链表的头结点分别比较挂载到结果节点的子节点
temp.next = pHead1
pHead1 = pHead1.next
else:
temp.next = pHead2
pHead2 = pHead2.next
temp = temp.next
if pHead1 == None: #如果比较出现结束,将未完的第二个节点挂载到结果节点上
temp.next = pHead2
break
if pHead2 == None:
temp.next = pHead1
break
return head #最终返回子节