要求:两个非空单项链表,需要将两者合并成一个且序列为顺序序列。 :::danger 不允许重新创建一个链表,将两者合并。 :::

    1. using System;
    2. class Node
    3. {
    4. public int val;
    5. public Node next;
    6. }
    7. class Program
    8. {
    9. static void Main(string[] args)
    10. {
    11. var list1 = MakeList(1,3,5,7,9,9,11,13);
    12. var list2 = MakeList(2,4,6,8,10,12,14);
    13. PrintList(list1);
    14. PrintList(list2);
    15. }
    16. static Node MakeList(params int[] a)
    17. {
    18. Node head = null;
    19. for(int i =a.Length-1;i>=0;i--)
    20. {
    21. head = new Node { val = a[i], next = head };
    22. }
    23. return head;
    24. }
    25. static void PrintList(Node List)
    26. {
    27. while(List != null)
    28. {
    29. Console.Write($"{List.val}->");
    30. List = List.next;
    31. }
    32. Console.WriteLine("null");
    33. }
    34. }
    1. using System;
    2. namespace text
    3. {
    4. class Node
    5. {
    6. public int val;
    7. public Node next;
    8. }
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. var list1 = MakeList(1, 3, 5, 7, 9, 9, 11, 13);
    14. var list2 = MakeList(2, 4, 6, 8, 10, 12, 14);
    15. var result = Zip(list1, list2);
    16. PrintList(result);
    17. }
    18. static Node Zip(Node p, Node q)
    19. {
    20. // 此句的写法称为 “dummyhead”
    21. // 链表设置虚拟头结点dummyhead,这样对链表来说,
    22. // 第一个元素就是dummyhead的next所对应的节点元素,而不是dummyhead所对应的节点元素。
    23. Node head = new Node(), zipper = head;
    24. while (true)
    25. {
    26. if (p == null)
    27. {
    28. zipper.next = q;
    29. break;
    30. }
    31. if (q == null)
    32. {
    33. zipper.next = p;
    34. break;
    35. }
    36. if (p.val <= q.val)
    37. {
    38. zipper.next = p;
    39. p = p.next;
    40. }
    41. else
    42. {
    43. zipper.next = q;
    44. q = q.next;
    45. }
    46. zipper = zipper.next;
    47. }
    48. return head.next;
    49. }
    50. // 将数据输入链表
    51. // params:可以指定采用可变数量参数的方法参数。参数类型必须是一维数组。
    52. static Node MakeList(params int[] a)
    53. {
    54. // 头指指针为空
    55. Node head = null;
    56. for (int i = a.Length - 1; i >= 0; i--)
    57. {
    58. head = new Node { val = a[i], next = head };
    59. }
    60. return head;
    61. }
    62. // 按位输出链表元素,输出完整链表之后输出Null说明输出结束。
    63. static void PrintList(Node List)
    64. {
    65. while (List != null)
    66. {
    67. Console.Write("{0}->",List.val);
    68. List = List.next;
    69. }
    70. Console.WriteLine("null");
    71. }
    72. }
    73. }
    1. static Node Zip(Node p, Node q)
    2. {
    3. Node head = new Node(), zipper = head;
    4. while (p != null && q != null)
    5. {
    6. if (p.val <= q.val)
    7. {
    8. zipper.next = p;
    9. p = p.next;
    10. }
    11. else
    12. {
    13. zipper.next = q;
    14. q = q.next;
    15. }
    16. zipper = zipper.next;
    17. }
    18. zipper.next = p == null ? q :p ;
    19. // zipper.next = p ?? q;
    20. return head.next;
    1. using System;
    2. namespace text
    3. {
    4. class Node
    5. {
    6. public int val;
    7. public Node next;
    8. }
    9. class Program
    10. {
    11. static void Main(string[] args)
    12. {
    13. var list1 = MakeList(9, 3, 5, 7, 9, 9, 11, 13);
    14. var list2 = MakeList(2, 4, 5, 8, 10, 12, 4);
    15. list1 = SortList(list1);
    16. list2 = SortList(list2);
    17. var result = Zip(list1, list2);
    18. PrintList(result);
    19. }
    20. //对两个链表进行排序合并
    21. static Node Zip(Node p, Node q)
    22. {
    23. // 此句的写法称为 “dummyhead”
    24. // 链表设置虚拟头结点dummyhead,这样对链表来说,
    25. // 第一个元素就是dummyhead的next所对应的节点元素,而不是dummyhead所对应的节点元素。
    26. Node head = new Node(), zipper = head;
    27. while (true)
    28. {
    29. // 由于是while(ture)无线循环,故进两次判断防止链表为空,中断循环。
    30. if (p == null)
    31. {
    32. zipper.next = q;
    33. break;
    34. }
    35. if (q == null)
    36. {
    37. zipper.next = p;
    38. break;
    39. }
    40. if (p.val <= q.val)
    41. {
    42. zipper.next = p;
    43. p = p.next;
    44. }
    45. else
    46. {
    47. zipper.next = q;
    48. q = q.next;
    49. }
    50. zipper = zipper.next;
    51. }
    52. return head.next;
    53. }
    54. // 将数据输入链表
    55. // params:可以指定采用可变数量参数的方法参数。参数类型必须是一维数组。
    56. static Node MakeList(params int[] a)
    57. {
    58. // 头指指针为空
    59. Node head = null;
    60. for (int i = a.Length - 1; i >= 0; i--)
    61. {
    62. head = new Node { val = a[i], next = head };
    63. }
    64. return head;
    65. }
    66. // 按位输出链表元素,输出完整链表之后输出Null说明输出结束。
    67. static void PrintList(Node List)
    68. {
    69. while (List != null)
    70. {
    71. Console.Write("{0}->",List.val);
    72. List = List.next;
    73. }
    74. Console.WriteLine("null");
    75. }
    76. //从小到大排序 暴力排序,每次只排序一个节点
    77. static Node SortList(Node list)
    78. {
    79. bool isLoop = true;
    80. Node startNode = list, preNode = null;//头节点 上一个节点
    81. while (isLoop)
    82. {
    83. isLoop = false;
    84. preNode = null;
    85. while (startNode != null && startNode.next != null)
    86. {
    87. Node nextNode = startNode.next;
    88. if (startNode.val > nextNode.val)
    89. {
    90. Node temp = nextNode.next;
    91. nextNode.next = startNode;
    92. startNode.next = temp;
    93. isLoop = true;
    94. if (preNode != null)
    95. {
    96. preNode.next = nextNode;
    97. }
    98. else
    99. {
    100. list = nextNode;
    101. }
    102. startNode = list; //确保l始终都是头节点
    103. break;
    104. }
    105. preNode = startNode;
    106. startNode = nextNode;
    107. }
    108. }
    109. return list;
    110. }
    111. }
    112. }

    :::danger 防止输入的链表非按顺序排序,对输入的链表先进行排序在进行后续操作。 :::