合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:类似于2路归并排序的合并操作,先取两个链表首结点值小者作为新链表的首结点,然后遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空,最后把至多一个非空链表首结点作为其后继结点。
步骤:
1 如果一个链表为空,则返回另一个链表。
2 取两个链表首结点值小者作为新链表的首结点。
3 遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空。
4 把至多一个非空链表首结点作为其后继结点。
5 返回新链表的首结点。
时间复杂度:O(len1+len2)。
Java代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
// 非递归,类似于归并排序
public ListNode Merge(ListNode list1, ListNode list2) {
// 如果至少有一个链表为空
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
// 确定首结点
ListNode head = null;
if (list1.val <= list2.val) {
head = list1;
list1 = list1.next;
} else {
head = list2;
list2 = list2.next;
}
ListNode cur = head;
while (list1 != null && list2 != null) {
ListNode min = null;
if (list1.val <= list2.val) {
min = list1;
list1 = list1.next;
} else {
min = list2;
list2 = list2.next;
}
cur.next = min;
cur = min;
}
// 处理剩余结点
if (list1 != null) {
cur.next = list1;
} else {
cur.next = list2;
}
return head;
}
}
浙公网安备 33010602011771号