前言
算法一直是自己的弱项,希望通过更新文章来补充自己的弱项,也欢迎各位大佬提出宝贵的意见,小弟在此不胜感激!
合并两个有序链表
题目表述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
我们可以用递归法来解决这个问题,将两个链表头部较小的一个与剩下的元素合并,并返回排好序的链表头,当两条链表中的一条为空时终止递归。当然,我们还可以用迭代法进行比较,通过比较两个链表的节点值,每次选择较小的节点,并将其添加到新链表中,然后将相应链表的指针向后移动一位。重复这个过程,直到其中一个链表的指针走到末尾,然后将另一个链表的剩余部分直接添加到新链表的末尾。
代码实现
1. 迭代法
function mergeTwoLists(l1, l2) {
let dummyHead = new ListNode(-1);
let current = dummyHead;
while (l1 && l2) {
if (l1.val <= l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
current.next = l1 || l2;
return dummyHead.next;
}
2. 迭代法
function mergeTwoLists(l1, l2) {
if (!l1) return l2;
if (!l2) return l1;
if (l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
注意事项
- 要确保输入的两个链表都是升序的。如果输入的链表不是升序的,则在合并前需要先进行排序。
- 要处理链表节点的指针操作时,确保在链表为空时能正确地返回另一个链表。
- 在处理链表节点的指针操作时,确保不会出现空指针异常,特别是在迭代法中需要仔细处理节点指针的变化。
- 考虑到链表可能有大量节点,合并链表的操作最好是通过修改节点的指针来实现,避免不必要的节点复制。
总结
这个算法运用到的知识分为:
- 单链表的数据结构:链表是由节点组成的数据结构,每个节点都包含一个值和指向下一个值的指针。
- 迭代:通过循环遍历链表节点,完成合并过程。
- 指针操作:在迭代中,需要处理链表节点的指针,进行节点间的连接和移动。
当然这里的回答还有代码不全是我自己想出来的,也是借鉴了其他人的一些回答来进行总结完善的,也希望自己有一天能独立完成解答过程,最后还是那句话,革命还未结束,小伙还需继续努力。