题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的。
解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中。

可以有递归、循环两种方式来解决。

  1. package Solution;
  2.  
  3. public class No17MergeSortedLists {
  4.  
  5. public static class ListNode {
  6. int data;
  7. ListNode next;
  8.  
  9. public ListNode() {
  10.  
  11. }
  12.  
  13. public ListNode(int value, ListNode next) {
  14. this.data = value;
  15. this.next = next;
  16. }
  17. }
  18.  
  19. public static void print(ListNode head) {
  20. if (head == null)
  21. System.out.println("当前链表为空");
  22. while (head != null) {
  23. System.out.print(head.data + ",");
  24. head = head.next;
  25. }
  26. System.out.println();
  27. }
  28.    //递归方式合并两个排序的链表
  29. public static ListNode merge(ListNode head1, ListNode head2) {
  30. if (head1 == null)
  31. return head2;
  32. if (head2 == null)
  33. return head1;
  34. ListNode mergedHead = null;
  35. if (head1.data < head2.data) {
  36. mergedHead = head1;
  37. mergedHead.next = merge(head1.next, head2);
  38. } else {
  39. // 如果两个节点的值相同,返回第二个
  40. mergedHead = head2;
  41. mergedHead.next = merge(head1, head2.next);
  42. }
  43. return mergedHead;
  44. }
  45. //依次比较两个链表的当前结点,添加到新链表中
  46. public static ListNode mergeSortedList(ListNode head1, ListNode head2) {
  47. if (head1 == null)
  48. return head2;
  49. if (head2 == null) {
  50. return head1;
  51. }
  52. ListNode newHead = null;
  53. ListNode newNode = null;
  54. ListNode list1 = head1;
  55. ListNode list2 = head2;
  56. // 找到新的头结点
  57. if (list1.data < list2.data) {
  58. newHead = list1;
  59. list1 = list1.next;
  60. } else {
  61. newHead = list2;
  62. list2 = list2.next;
  63. }
  64. newNode = newHead;
  65. // 合并其他节点
  66. while (list1 != null && list2 != null) {
  67. if (list1.data < list2.data) {
  68. newNode.next = list1;
  69. list1 = list1.next;
  70. } else {
  71. newNode.next = list2;
  72. list2 = list2.next;
  73. }
  74. newNode = newNode.next;
  75. }
  76. // 有一条链表合并完,则把剩下的另一条链表直接合并到新链条末尾
  77. if (list1 == null) {
  78. newNode.next = list2;
  79. } else {
  80. newNode.next = list1;
  81. }
  82. return newHead;
  83. }
  84.  
  85. public static void main(String[] args) {
  86. ListNode node1 = new ListNode(7, null);
  87. ListNode node2 = new ListNode(4, node1);
  88. ListNode node3 = new ListNode(3, node2);
  89. ListNode head1 = new ListNode(1, node3);
  90.  
  91. ListNode node5 = new ListNode(8, null);
  92. ListNode node6 = new ListNode(6, node5);
  93. ListNode node7 = new ListNode(4, node6);
  94. ListNode head2 = new ListNode(2, node7);
  95. // 测试含有相同值得两个对各节点的链表的合并,合并后head1和merged1都指向合并后的新链表的头结点
  96. // ListNode merged1 = merge(head1, head2);
  97. // print(merged1);
  98. // // 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
  99. // print(merge(head2, null));
  100. // // 测试两个链表中只有一个节点
  101. // print(merge(null, new ListNode(10, null)));
  102. ListNode merged1 = mergeSortedList(head1, head2);
  103. print(merged1);
  104. // 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
  105. print(mergeSortedList(head2, null));
  106. // 测试两个链表中只有一个节点
  107. print(mergeSortedList(null, new ListNode(10, null)));
  108. }
  109.  
  110. }

剑指offer面试题17:合并两个排序的链表的更多相关文章

  1. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  2. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

  3. 剑指offer十六之合并两个排序的链表

    一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...

  4. 【剑指Offer】16、合并两个排序的链表

      题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...

  5. 剑指offer(16)合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...

  6. 剑指offer-面试题17.合并两个排序的链表

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  7. 《剑指offer》面试题17 合并两个排序的链表 Java版

    我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...

  8. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  9. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

随机推荐

  1. sort排序在苹果与安卓端不一致问题

    一.问题 在使用sort排序时,若遇到相同数据或非数值数据时,会出现苹果手机与安卓手机排序不一致问题 var arr = [{ "id": "52", &quo ...

  2. CAPTCHA--验证码

    验证码开发有两种方法: 1.自己用代码画一个 2.调用ValidateCode.jar工具包 第一种方式: 创建一个动态web工程 编写一个Servlet,在该Servlet内进行如下操作 验证码开发 ...

  3. Python语言学习之C++调用python

    C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可以替代动态链接库形式的接口,这样可以方便地根据需要修改脚本代码,而不用重新编译链接二进 ...

  4. python 13 常用模块 一

    一.time模块 1.time.time()获取当前时间戳,返回长整型 2.time.localtime() 获取当地结构化时间,time.gmtime()获取格林尼治时间   一图需要传入匹配格式, ...

  5. Java 初学UDP传输

    不谈理论,先举简单例子. 发送端代码: public class UDPDemo { public static void main(String[] args) throws Exception { ...

  6. 关于numpy中的函数return中加入字符串类型数据后,小数点精度变化

    weekdays.pyimport numpy as npfrom datetime import datetimedef datestr2num(s): return datetime.strpti ...

  7. vue中created、mounted、 computed,watch,method 等方法整理

    created:html加载完成之前,执行.执行顺序:父组件-子组件 mounted:html加载完成后执行.执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个 ...

  8. sublime构建各个编译环境

    一 java运行环境配置: 打开sublime选择Tool 到 Building System 选择new building System 输入 {"shell_cmd": &qu ...

  9. MUI动态生成轮播图片

    $$.ajax({ url:'http://localhost:8080/api/v1/food/listFeatureFood', type:'Get', xhrFields: {withCrede ...

  10. EC20指令测试

    cat /dev/ttyUSB2 & echo -e "AT+CGMM\r\n" >/dev/ttyUSB2   //输出模块型号 echo -e "AT+ ...