前言
- 排序问题基本都逃不过迭代和对比!
- 什么时候对比结束?即迭代继续的条件是?
- 链表问题基本要考虑头节点,避免边界判断,要用啥?
一、题目描述
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
}