1、问题描述
输入两个递增排序的链表,合并两个链表,使合并后的链表中的节点仍按照递增排序。合并链表的过程如下:
2、解题思路
- 思路1:这个问题与合并两个有序数组的解题思路是一样的。先分析两个链表头节点的合并,如果第一个链表的头节点的值小于第二个链表的头节点的值,那么合并后链表的头节点即为第一个链表的头节点,否则为第二个链表的头节点。我们继续合并两个链表中剩余的节点,由于剩余的节点仍是按照递增的,因此合并这两个链表的步骤与前面合并头节点的步骤一样。
- 以合并下面这两个有序链表为例,首先让p1指向第一个链表的第一个节点1,p2指向第二个链表的第一个节点2,由于1小于2,所以合并后链表的第一个节点是1,p1向后移动一个节点,指向3。接下来的工作就是合并第一个链表剩下的节点 3 → 5 → 7 3\rightarrow 5 \rightarrow 7 3→5→7和第二个链表,由于3大于2,所以合并后链表的第二个节点是2,p2向后移动一个节点。
3、代码实现
(1)合并两有序链表的迭代实现:
# -*- 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
newlist = ListNode(None)
pHead3 = newlist
p = pHead1
q = pHead2
while p != None and q != None:
if p.val <= q.val:
newlist.next = p
p = p.next
else:
newlist.next = q
q = q.next
newlist = newlist.next
if p == None:
while q != None:
newlist.next = q
q = q.next
if q == None:
while p != None:
newlist.next = p
p = p.next
return pHead3.next
(2)合并两个有序链表的递归实现:
# -*- 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
if pHead2 == None:
return pHead1
pMergeHead = ListNode(None)
if pHead1.val < pHead2.val:
PMergeHead = pHead1
pMergeHead.next = self.Merge(pHead1.next,pHead2)
else:
pMergeHead = pHead2
pMergeHead.next = self.Merge(pHead1,pHead2.next)
return pMergeHead