【剑指offer】016-合并两个排序的链表

题目

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

方法

方法:迭代法,递归法
时间复杂度:m + n

递归法

思路

通过从小到大的顺序合并两个链表,从两个链表的头指针p1,p2开始,以两个头指针中小的那个作为新的头指针newHead,假设这里是p1较小,p1作为newHead
接下来newHead的next可能是原来的p1.next,也可能是p2,需要再次做对比,所以将p1.next和p2传入递归函数,将较小值返回
以此类推,做递归处理。当p1或者p2,某个链表已经到达尾结点null的时候,直接返回另一个链表的剩余部分,相当于直接将剩余节点接上

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Merge(pHead1, pHead2{
  // write code here
  if (!pHead1) return pHead2
  if (!pHead2) return pHead1
  
  let newHead
  if (pHead1.val < pHead2.val) {
    newHead = pHead1
    newHead.next = Merge(pHead1.next, pHead2)
  } else {
    newHead = pHead2
    newHead.next = Merge(pHead1, pHead2.next)
  }
  return newHead
}

迭代法

思路

迭代法和递归法的思路类似,只是在对比完某两个节点后,通过white循环进入下一次比较即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function Merge(pHead1, pHead2{
  // write code here
  if (!pHead1) return pHead2
  if (!pHead2) return pHead1
  let newHead = new ListNode()
  let p = newHead
  while (pHead1 && pHead2) {
    if (pHead1.val < pHead2.val) {
      p.next = pHead1
      pHead1 = pHead1.next
    } else {
      p.next = pHead2
      pHead2 = pHead2.next
    }
    p = p.next
  }
  if (pHead1) p.next = pHead1
  if (pHead2) p.next = pHead2
  return newHead.next
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-016/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG