链表结点结构

  1. class ListNode{
  2. int value;
  3. ListNode next = null;
  4. public ListNode(int value){
  5. this.value = value;
  6. }
  7. }

题目描述

  • 输入两个单调递增的链表,输出两个链表合成后的链表
  • 当然我们需要合成后的链表满足单调不减规则

递归解法

  • 比较两个链表的开头结点,则可以确定合并后链表的第一个结点
  • 除合并后的结点外,再次比较两个链表的开头结点,则可以确定合并后链表的第二个结点
  • 以此类推,直到所有结点均成为合并后链表中的结点

  1. public static ListNode merge(ListNode list1,ListNode list2) {
  2. if(list1 == null){
  3. return list2;
  4. }
  5. if(list2 == null){
  6. return list1;
  7. }
  8. ListNode mergeListHead = null;
  9. if(list1.value < list2.value){
  10. mergeListHead = list1;
  11. mergeListHead.next =merge(list1.next,list2);
  12. }else{
  13. mergeListHead = list2;
  14. mergeListHead.next = merge(list1,list2.next);
  15. }
  16. return mergeListHead;
  17. }

非递归解法

  • 初始化合并后的头结点
  • 遍历两个链表,取出较小的结点,加入到合并链表中
  • 如果长度不同,处理剩余的结点到合并链表中

  1. public static ListNode merge2(ListNode list1,ListNode list2) {
  2. if(list1 == null){
  3. return list2;
  4. }
  5. if(list2 == null){
  6. return list1;
  7. }
  8. ListNode mergeList = null;
  9. ListNode curNode = null;
  10. //初始化第一个结点
  11. if(list1.value < list2.value){
  12. curNode = list1;
  13. list1 = list1.next;
  14. curNode.next = null;
  15. mergeList = curNode;
  16. }else{
  17. curNode = list2;
  18. list2 = list2.next;
  19. curNode.next = null;
  20. mergeList = curNode;
  21. }
  22. //遍历两个链表,取出较小的结点,加入到合并链表中
  23. ListNode mergeNode = mergeList;
  24. while(list1 != null && list2 != null){
  25. if(list1.value < list2.value){
  26. curNode = list1;
  27. list1 = list1.next;
  28. curNode.next = null;
  29. mergeNode.next = curNode;
  30. mergeNode = mergeNode.next;
  31. }else{
  32. curNode = list2;
  33. list2 = list2.next;
  34. curNode.next = null;
  35. mergeNode.next = curNode;
  36. mergeNode = mergeNode.next;
  37. }
  38. }
  39. //处理剩余的结点
  40. while(list1 != null){
  41. curNode = list1;
  42. list1 = list1.next;
  43. curNode.next = null;
  44. mergeNode.next = curNode;
  45. mergeNode = mergeNode.next;
  46. }
  47. while(list2 != null){
  48. curNode = list2;
  49. list2 = list2.next;
  50. curNode.next = null;
  51. mergeNode.next = curNode;
  52. mergeNode = mergeNode.next;
  53. }
  54. return mergeList;
  55. }
  56. <p></p>