经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » TypeScript » 查看文章
TypeScript合并两个排序链表的方法详解
来源:jb51  时间:2022/6/27 10:53:35  对本文有异议

前言

给定两个递增排序的链表,如何将这两个链表合并?合并后的链表依然按照递增排序。本文就跟大家分享一种解决方案

思路分析

经过前面的学习,我们知道了有关链表的操作可以用指针来完成。同样的,这个问题也可以用双指针的思路来实现:

  • p1指针指向链表1的头节点
  • p2指针指向链表2的头节点

声明一个变量存储合并后的链表,比对两个指针指向的节点值大小:

  • 如果p1指针指向的节点值比p2指向的值小,合并后的链表节点就取p1节点的值,p1指针继续向前走,进行下一轮的比对
  • 如果p2指针指向的节点值比p1指向的值小,合并后的链表节点就取p2节点的值,p2指针继续向前走,进行下一轮的比对
  • 当p1节点指向null时,合并后的链表节点就为p2所指向的链表节点;当p2节点指向null时,合并后的链表节点就为p1所指向的链表节点。

image-20220627070633451

实现代码

看完上述分析后,聪明的开发者已经想到代码怎么写了。没错,这就是典型的递归思路,代码如下:

1.声明一个函数MergeLinkedList,它接受2个参数:递增排序的链表1,递增排序的链表2

2.递归的基线条件:链表1为null就返回链表2,链表2为null就返回链表1

3.声明一个变量pMergedHead用于存储合并后的链表头节点

4.如果当前链表1的节点值小于链表2的节点值

  • pMergedHead的值就为链表2的节点值
  • pMergedHead的下一个节点值就为链表1的下一个节点和链表2的节点值比对后的值(递归)

5.否则

  • pMergedHead的值就为链表1的节点值
  • pMergedHead的下一个节点值就为链表2的下一个节点和链表1的节点值比对后的值(递归)

6.最后,返回pMergedHead

  1. export function MergeLinkedList(
  2. firstListHead: ListNode | null,
  3. secondListHead: ListNode | null
  4. ): ListNode | null {
  5. // 基线条件
  6. if (firstListHead == null) {
  7. return secondListHead;
  8. }
  9. if (secondListHead == null) {
  10. return firstListHead;
  11. }
  12. let pMergedHead: ListNode | null = null;
  13. if (firstListHead.element < secondListHead.element) {
  14. pMergedHead = firstListHead;
  15. pMergedHead.next = MergeLinkedList(firstListHead.next, secondListHead);
  16. } else {
  17. pMergedHead = secondListHead;
  18. pMergedHead.next = MergeLinkedList(firstListHead, secondListHead.next);
  19. }
  20. return pMergedHead;
  21. }

测试用例

接下来,我们用思路分析章节中的例子来测试下我们的代码能否正常执行。

  1. const firstLinkedList = new LinkedList();
  2. firstLinkedList.push(1);
  3. firstLinkedList.push(3);
  4. firstLinkedList.push(5);
  5. firstLinkedList.push(7);
  6. firstLinkedList.push(9);
  7. const secondLinkedList = new LinkedList();
  8. secondLinkedList.push(2);
  9. secondLinkedList.push(4);
  10. secondLinkedList.push(6);
  11. secondLinkedList.push(8);
  12.  
  13. const resultListHead = MergeLinkedList(
  14. firstLinkedList.getHead(),
  15. secondLinkedList.getHead()
  16. );
  17.  
  18. console.log(resultListHead);
  19.  

image-20220627072844184

示例代码

本文所列举的代码如下

MergeLinkedList.ts

  1. import { ListNode } from "./utils/linked-list-models.ts";
  2.  
  3. /**
  4. * 合并两个排序的链表
  5. * 1. p1指针指向链表1,p2指针指向链表2
  6. * 2. 递归比对指针指向的两个值,构造新的链表
  7. * @param firstListHead 链表1
  8. * @param secondListHead 链表2
  9. * @constructor
  10. */
  11. export function MergeLinkedList(
  12. firstListHead: ListNode | null,
  13. secondListHead: ListNode | null
  14. ): ListNode | null {
  15. // 基线条件
  16. if (firstListHead == null) {
  17. return secondListHead;
  18. }
  19. if (secondListHead == null) {
  20. return firstListHead;
  21. }
  22. let pMergedHead: ListNode | null = null;
  23. if (firstListHead.element < secondListHead.element) {
  24. pMergedHead = firstListHead;
  25. pMergedHead.next = MergeLinkedList(firstListHead.next, secondListHead);
  26. } else {
  27. pMergedHead = secondListHead;
  28. pMergedHead.next = MergeLinkedList(firstListHead, secondListHead.next);
  29. }
  30. return pMergedHead;
  31. }

MergeLinkedList-test.ts

  1. import { MergeLinkedList } from "../MergeLinkedList.ts";
  2. import LinkedList from "../lib/LinkedList.ts";
  3.  
  4. const firstLinkedList = new LinkedList();
  5. firstLinkedList.push(1);
  6. firstLinkedList.push(3);
  7. firstLinkedList.push(5);
  8. firstLinkedList.push(7);
  9. firstLinkedList.push(9);
  10. const secondLinkedList = new LinkedList();
  11. secondLinkedList.push(2);
  12. secondLinkedList.push(4);
  13. secondLinkedList.push(6);
  14. secondLinkedList.push(8);
  15.  
  16. const resultListHead = MergeLinkedList(
  17. firstLinkedList.getHead(),
  18. secondLinkedList.getHead()
  19. );
  20.  
  21. console.log(resultListHead);

到此这篇关于TypeScript合并两个排序链表的方法详解的文章就介绍到这了,更多相关TypeScript合并排序链表内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号