题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
题目链接:合并两个排序的链表
思路:类似于2路归并排序的合并操作,先取两个链表首结点值小者作为新链表的首结点,然后遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空,最后把至多一个非空链表首结点作为其后继结点。2路归并排序的具体内容可以看数据结构 归并排序这篇博客。
步骤:
1 如果一个链表为空,则返回另一个链表。
2 取两个链表首结点值小者作为新链表的首结点。
3 遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空。
4 把至多一个非空链表首结点作为其后继结点。
5 返回新链表的首结点。
时间复杂度:O(len1+len2)。
Java代码:
1 /*
2 public class ListNode {
3 int val;
4 ListNode next = null;
5
6 ListNode(int val) {
7 this.val = val;
8 }
9 }*/
10 public class Solution {
11 // 非递归,类似于归并排序
12 public ListNode Merge(ListNode list1, ListNode list2) {
13 // 如果至少有一个链表为空
14 if (list1 == null) {
15 return list2;
16 }
17 if (list2 == null) {
18 return list1;
19 }
20
21 // 确定首结点
22 ListNode head = null;
23 if (list1.val <= list2.val) {
24 head = list1;
25 list1 = list1.next;
26 } else {
27 head = list2;
28 list2 = list2.next;
29 }
30
31 ListNode cur = head;
32 while (list1 != null && list2 != null) {
33 ListNode min = null;
34 if (list1.val <= list2.val) {
35 min = list1;
36 list1 = list1.next;
37 } else {
38 min = list2;
39 list2 = list2.next;
40 }
41
42 cur.next = min;
43 cur = min;
44 }
45
46 // 处理剩余结点
47 if (list1 != null) {
48 cur.next = list1;
49 } else {
50 cur.next = list2;
51 }
52
53 return head;
54 }
55 }