likes
comments
collection
share

LeetCode——[21]合并两个有序链表

作者站长头像
站长
· 阅读数 34

[21] 合并两个有序链表

思路

可以列举如下两个链表:

// 1 -> 3 -> 5 -> 7 -> 9
// 2 -> 4 -> 6 -> 8 -> 10

定义一个新的链表头,这个头节点可以缓存最终的结果,再定义一个指针,初始时指向头节点:

let head = new ListNode();
let curr = head;

再定义两个指针,利用这两个指针分别对list1list2进行迭代:

// 根据开头的两个例子,可以看成,在初始时,curr_1就是第一个链表的1
let curr_1 = list1;
// curr_2就是第二个链表的2
let curr_2 = list2;

此时,要对两个链表进行合并,则需要对两个链表同时迭代:

while (curr_1 !== null && curr_2 !== null) {
  // 都不为null时才进入遍历
  if (curr_1.val < curr_2.val) {
    // 如果链表1的当前值更小,那新头的指针curr.next就指向它
    curr.next = curr_1;
    // 此时较小值已被指向,所以就取下一个,而当前遍历到的较大值不变
    // 进入下一次遍历的对比
    curr_1 = curr_1.next;
  } else {
    // 同理
    curr.next = curr_2;
    curr_2 = curr_2.next;
  }
  curr = curr.next;
}

两个链表的长度不一定相等,所以最终可能会剩余一截链表,如果还剩了,那么肯定直接指向剩下的那一截链表的头:

curr.next = curr_1 === null ? curr_2 : curr_1;

最终结果

function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
  if (list1 === null && list2 === null) return null;
  if (list1 === null || list2 === null) return list1 || list2;
  // 这个头节点用来保存结果,首先根据题干,假设结果为最小极限值
  let head = new ListNode();
  // 这个是指针,用来指向head中的当前节点
  let curr = head;
  let curr_1 = list1;
  let curr_2 = list2;
  while (curr_1 !== null && curr_2 !== null) {
    // 都不为null时才进入遍历
    if (curr_1.val < curr_2.val) {
      curr.next = curr_1;
      curr_1 = curr_1.next;
    } else {
      curr.next = curr_2;
      curr_2 = curr_2.next;
    }
    curr = curr.next;
  }
  // 如果有一截还剩着
  curr.next = curr_1 === null ? curr_2 : curr_1;
  return head.next;
}
转载自:https://juejin.cn/post/7075223492752310280
评论
请登录