爷也要刷力扣06合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

public class Solution1 {
    
    

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
        if (l1 == null) {
    
    
            return l2;
        }
        if (l2 == null) {
    
    
            return l1;
        }
        if (l1.val < l2.val) {
    
    
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
    
    
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

}

迭代和递归都能解题。无非是依次将两个链表每个节点的值对比,取出值较小的节点,添加到新链表末尾。然后继续比较两个链表,直到其中一个链表遍历完成,此时另一个链表剩余所有节点直接添加到新链表之后即可。其逻辑为:

原链表:1->2->4->null,1->3->4->5->6->null
依次对比节点值,取出各自头节点:1 = 1
值相同取出一个节点 1,组成新链表:1
此时原链表:2->4->null,1->3->4->5->6->null

对比头节点值:2 > 1
取出 1 节点,添加到新链表末尾:1->1
此时原链表:2->4->null,3->4->5->6->null

对比头节点值:2 < 3
取出 2 节点,添加到新链表末尾:1->1->2
此时原链表:4->null,3->4->5->6->null

…依次类推,直到其中一个原链表为空时:

原链表:null,4->5->6->null
新链表:1->1->2->3->4
这时其中一个原链表已经为空,则直接将另一个原链表添加到新链表末尾即可:
1->1->2->3->4->4->5->6->null

class Solution {
    
    
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
        ListNode head = new ListNode(-1);//新建虚拟头节点
        ListNode cur = head;//当前节点指向虚拟头节点
        while (l1 != null && l2 != null) {
    
    //循环条件为链表都不为空
            if (l1.val < l2.val) {
    
    //比较头节点的值的大小
                cur.next = l1;//当前节点连接到节点值较小的一个
                l1 = l1.next;//刷新原链表头节点
                cur = cur.next;//刷新当前节点
            } else {
    
    
                cur.next = l2;
                l2 = l2.next;
                cur = cur.next;
            }
        }
        if (l1 == null) cur.next = l2;//选择另外一个不为空的原链表,连接到新链表末尾
        else cur.next = l1;
        return head.next;//返回虚拟头节点的下一个节点,即真实头节点
    }
}

/*作者:爱写Bug
链接:https://www.imooc.com/article/289851
来源:慕课网
本文首次发布于慕课网 ,转载请注明出处,谢谢合作

猜你喜欢

转载自blog.csdn.net/qq_45864370/article/details/108702232
今日推荐