牛客网 剑指Offer JZ16 合并两个排序的链表

描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入:{1,3,5},{2,4,6}

返回值:{1,2,3,4,5,6}

 

方法一:迭代 很好理解


初始化:定义cur指向新链表的头结点
操作:

  1. 如果l1指向的结点值小于等于l2指向的结点值,则将l1指向的结点值链接到cur的next指针,然后l1指向下一个结点值
  2. 否则,让l2指向下一个结点值
  3. 循环步骤1,2,直到l1或者l2为None
  4. 将l1或者l2剩下的部分链接到cur的后面

技巧

一般创建单链表,都会设一个虚拟头结点,也叫哨兵,因为这样每一个结点都有一个前驱结点。

def Merge(self, pHead1, pHead2):
        cur = ListNode(-1)
        first = cur
        while (pHead1 is not None) and (pHead2 is not None):
            if pHead1.val <= pHead2.val:
                cur.next = pHead1
                pHead1 = pHead1.next
            else :
                cur.next = pHead2
                pHead2 = pHead2.next
            cur = cur.next
        if pHead1 is not None:
            cur.next = pHead1
        else:
            cur.next = pHead2
        return first.next
时间复杂度:O(m+n),m,n分别为两个单链表的长度
空间复杂度:O(1)

 

方法二:递归

其实方法是一样的,考虑方法反过来而已

先考虑最后,剩啥是啥

然后从前往后,按从小到大的顺序到能比较的最下面,

根据递归的特点,从下到上翻上来

 

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        if pHead1 is None :
            return pHead2
        if pHead2 is None :
            return pHead1
        if pHead1.val <= pHead2.val:
            pHead1.next = self.Merge(pHead1.next, pHead2)
            return pHead1
        else :
            pHead2.next = self.Merge(pHead1, pHead2.next)
            return pHead2
时间复杂度:O(m+n)
空间复杂度:O(m+n),每一次递归,递归栈都会保存一个变量,最差情况会保存(m+n)个变量

 

posted @ 2021-08-04 23:34  zhang_upstar  阅读(44)  评论(0编辑  收藏  举报