将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
循环实现,创建一个头结点,再创建一个排序指针指向头结点。指向较小的结点,再比较后两个结点的大小,把指针指向小的那一个结点,当前链表指针要后移一位,每次循环结束指向头结点的排序指针要后移一位
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//头结点
ListNode head = new ListNode(-1);
//指针
ListNode pre = head;
//还没到达末尾时
while (l1 != null && l2 != null) {
//那个值小就讲指针的next指向它
if (l1.val <= l2.val) {
pre.next = l1;
//后移一位
l1 = l1.next;
} else {
pre.next = l2;
l2 = l2.next;
}
//循环末尾要讲指针指向下一个
pre = pre.next;
}
//还会剩下一个结点还没正确排序,为空的说明已经排序了,不为空说明就是它还没排序了
pre.next = l1 == null ? l2 : l1;
//头结点不是我们要的答案,要返回头结点下一个,即第一个结点
return head.next;
}
}
利用递归,思路其实和1差不多,我们可以从最后一个推到第一个,也就慢慢地连成了一个我们需要的有序链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//基线条件
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
//如果l1的值小的话,那么将l1的下一位和l2进行比较,得到的结果就是这个l1的next
if (l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
原文:https://www.cnblogs.com/linzedian/p/13763192.html