题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目地址:https://leetcode.cn/problems/merge-two-sorted-lists/
实例
方法1:插入法(自己写的)
这是作者自己写的菜鸟方法
思路
让开头大的链表全部插入到开头小的链表里面,最后返回小的链表即可
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode big = list1;
ListNode small = list2;
//排除特殊情况
if (big==null && small==null)return null;
if (big==null )return small;
if (small==null )return big;
//让p是大的那个
if (big.val < small.val){
ListNode index = big;
big = small;
small = index;
}
ListNode head = small;
ListNode current = big.next;
while (true){
if (small.next == null){//如果q后面空了
small.next = big;
//这里不要返回small,要返回gead,因为后面的操作会让small往后走,它就不是头了
return head;
}
//位置如果合适,就执行插入
if (big.val>=small.val && big.val<small.next.val){
//执行插入
big.next = small.next;
small.next = big;
if (current == null){//说明 big已经插入完了
return head;
}
big = current;
current = current.next;
//位置不对,就让q往后走,找合适位置
}else small = small.next;
}
}
}
效果
方法2:递归法(力扣官方题解)
思路
(递归属于是自己写很难写出来,但多看看能看懂)
终止条件:当两个链表都为空时,表示我们对链表已合并完成。
如何递归:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)例如:
作者:z1m
链接:https://leetcode.cn/problems/merge-two-sorted-lists/solution/yi-kan-jiu-hui-yi-xie-jiu-fei-xiang-jie-di-gui-by-/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
效果