合并两个排序链表
一、题目
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
二、解析
首先有两个链表,合并成新的链表;你要知道一条链表只要知道他的一个头就等于获得了整条链表,因此本题输入输出都是头,输入的是两条旧链的header,输出是新的链的header
设置三个指针(如果把新链表的header也当成指针就是四个),这三个指针分别是两条旧链的当前位置,一条新链的当前位置
步骤:
-
边界条件
– 1 判断边界条件,如果某一条旧链为空,那么直接返回另外一条链即可 -
最开始的工作
– 1 因为输出的是新链表的头,设置newHead,等于两条旧链的头部最小值
– 2 引入三个指针,分别是两条旧链当前的位置,也是之后用来进行比较谁大,以及新链表的当前位置
– 3 既然新链表的表头newHead已经确定,那么将它指向下一个节点吧 -
开始进入循环,只要两个旧链表的当前位置不为空,就一直循环下去,循环就是更新当前新链表取值以及指向下一个位置
– 比较两条旧链表当前位置谁小,新链表指针指向小的,并且更新
– 注意更新的有两个东西,一个是新链表更新为旧链表小的那一个,另一个更新原本小的旧链表header -
出去循环证明有一个链表的当前位置到最后啦,那么当前的新链表直接连在另一条旧链表上即可。
# -*- 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
newHead = pHead1 if pHead1.val<pHead2.val else pHead2
# 引入两个指针,记录链条链表到达了哪里
pTmp1 = pHead1
pTmp2 = pHead2
# 指针开始移动
if newHead == pTmp1:
pTmp1 = pTmp1.next
else:
pTmp2 = pTmp2.next
# 再引入一个指针,指得是新的一条链的当前的位置,用于记录当前的位置
previousPointer = newHead
# 开始循环,他们有一个为空就不循环
while pTmp1 and pTmp2:
if pTmp1.val < pTmp2.val:
previousPointer.next = pTmp1 # 当前的节点指向一个小的节点
previousPointer = pTmp1
pTmp1 = pTmp1.next # 跳指针
else:
previousPointer.next = pTmp2
previousPointer = pTmp2
pTmp2 = pTmp2.next
# 循环出来是pTmp1或者pTmp2有一个值为空,判断是哪一个值为空
if pTmp1 == None: # pTmp1已经到头了,所以新链表接到另外一条的前面就好
previousPointer.next = pTmp2
else:
previousPointer.next = pTmp1
return newHead # 因为是链表,所以输出一个头,其他的都会知道了