用JavaScript刷leetcode第21题-合并两个有序链表

203 阅读1分钟

前言

  • 排序问题基本都逃不过迭代和对比!
  • 什么时候对比结束?即迭代继续的条件是?
  • 链表问题基本要考虑头节点,避免边界判断,要用啥?

一、题目描述

leetcode地址
git代码
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

二、解题

2.1 思路

  • 排序问题,基本都是逃不过迭代对比。那么问题来了什么时候迭代结束?其中一个链表到尾节点。
  • 合并后的头节点并不确定,减少边界判断,用虚拟头节点。

2.2 代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
 
 const mergeTwoLists = function(l1, l2) {
   // 虚拟头节点
   const hair = new ListNode(-1)
   
   // 后移指针, 合并后的节点每增加一个,就往后移一位
   let p = hair
   
   // 迭代继续的条件,两个链表都没有到尾节点
   while(l1 && l2) {
     // 对比, 若l2节点数据域更小,则往合并的新链表后增,同时l2和p同时往后移一位,反之就不写了,偷懒。看代码
     if(l1.val > l2.val) {
       p.next = l2
       l2 = l2.next
     } else {
       p.next = l1
       l1 = l1.next
     }
     p = p.next
   }
   
   // 到这里说明其中至少一个链表已经遍历排序完成,但是可能另一个链表还没排完,故处理如下
   
   // 若l1未排完
   while(l1) {
     p.next = l1
     l1 = l1.next
     p = p.next
   }
   
   // 若l2未排完
   while(l2) {
     p.next = l2
     l2 = l2.next
     p = p.next
   }
   
   return hair.next
 }