剑指offer第16题 牛客网在线编程链接 https://www.nowcoder.com/activity/oj
合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路1
首先,我们要找到新链表的首节点new_head,new_head为两个给定链表首节点元素的较小值。接着,不断地将给定链表中的较小的节点元素加入到新链表中,直到其中一个链表到达尾结点,即这个链表遍历完毕。然后,我们把另外一个链表中剩余的节点加入到新链表中,至此,完成了两个单调递增链表的合并。代码鲁棒性:输入的两个链表中可能有空链表,所以要先进行判断。
Python2.7编写
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
#如果pHead1为空链表,则直接返回pHead2
if not pHead1:
return pHead2
#如果pHead2为空链表,则直接返回pHead1
if not pHead2:
return pHead1
p1 = pHead1
p2 = pHead2
#先找到合并后链表的首节点,用new_head保存
if p1.val <= p2.val:
new_head = ListNode(p1.val)
p1 = p1.next
else:
new_head = ListNode(p1.val)
p2 = p2.next
#用另一个指针p指向新的首节点
p = new_head
#不断地将两个链表中较小的元素节点加入到新链表中,直到其中一个链表到达尾结点
while p1 and p2:
if p1.val <= p2.val:
p.next = ListNode(p1.val)
p = p.next
p1 = p1.next
else:
p.next = ListNode(p2.val)
p = p.next
p2 = p2.next
#将还没有到达尾结点的链表中剩余的元素加入到新链表中
while p1 or p2:
if p1 is not None:
while p1:
p.next = ListNode(p1.val)
p = p.next
p1 = p1.next
if p2 is not None:
while p2:
p.next = ListNode(p2.val)
p = p.next
p2 = p2.next
return new_head
思路2 递归
我们发现每次都是两个链表中的节点进行比较,这是一个重复的过程,可以用递归的方法解决。
Python2.7编写
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
#其中一个链表遍历完毕或者给定链表中有空链表
if pHead1 == None:
return pHead2
elif pHead2 == None:
return pHead1
new_head = None
if pHead1.val <= pHead2.val:
new_head = pHead1
new_head.next = self.Merge(pHead1.next,pHead2)
else:
new_head = pHead2
new_head.next = self.Merge(pHead1,pHead2.next)
return new_head
写下后面
思路二参考:https://github.com/Jack-Lee-Hiter/AlgorithmsByPython/blob/master/Target Offer/合并两个排序的链表.py