剑指offer 16、 合并两个排序的链表 python c++
题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
新建一个链表做为最后结果,依次比较两个链表的值的大小,小的加到新链表。直到其中一个链表里面没元素了,然后把剩下的一个还有元素的链表插到新链表后面
c++版
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
ListNode *res = new ListNode(0); //初始化一个0,不初始化下面保存起始节点可能报错
ListNode *head;
head = res; //保存起始节点
while(pHead1 && pHead2){ //两个都还有元素
if(pHead1->val >= pHead2->val){
res->next = pHead2;
pHead2 = pHead2->next;
}
else{
res->next = pHead1;
pHead1 = pHead1->next;
}
res = res->next;
}
if(pHead1){ //如果剩下的还有元素的是链表1
res->next = pHead1;
}
if(pHead2){ //如果剩下的还有元素的是链表2
res->next = pHead2;
}
return head->next; //返回head->next是因为head的值为0(我们初始化的那个)我们不要这个初始化的值
}
};
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
res = ListNode(0)
head = res
while pHead1 and pHead2:
if pHead1.val >= pHead2.val:
res.next = pHead2
pHead2 = pHead2.next
else:
res.next = pHead1
pHead1 = pHead1.next
res = res.next
if pHead1:
res.next = pHead1
if pHead2:
res.next = pHead2
return head.next
还有一个笨办法, 最容易想到的,我把所有值取出来放数组里,从小到大排个序,然后利用这些值依次构造链表节点,串起来。
python版2
# -*- 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
res = []
#把两个链表的值全取出来放在列表里面
while pHead1:
res.append(pHead1.val)
pHead1 = pHead1.next
while pHead2:
res.append(pHead2.val)
pHead2 = pHead2.next
res.sort() #排个序
dummy = ListNode(0) #开始构造链表
head = dummy #保存初始节点
for i in res:
node = ListNode(i) #利用列表里面的值构造节点
dummy.next = node #串接起来
dummy = dummy.next
return head.next #返回head->next是因为head的值为0(我们初始化的那个)我们不要这个初始化的值