【链表】LeetCode21. 合并两个有序链表

107 阅读1分钟

题目

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

示例

输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]

递归

主要思路

1. 首先递归的终止条件是当两个链表分别为null时,
2. l1为空时,因为需要合并链表,所以返回l2
3. l2为空时,返回l1
4. 然后判断当前节点值的大小,构建新链表

递归代码

 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. 遍历l1和l2所以节点
3. l1节点的值比l2节点值小时,将l1节点连接到新链表上
4. l2节点的值比l1节点值小时,将l2节点连接到新链表上
5. 最后判断链表l1是否还有节点

迭代代码

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummty = new ListNode(0);
        ListNode tail = dummty;
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                //连接到虚拟头结点的链表上
                tail.next = l1;
                l1 = l1.next;
            }else{
                //连接到虚拟头结点的链表上
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
        }
        //此时有可能两个链表其中有剩余节点
        tail.next = l1 == null? l2 : l1;
        return dummty.next;
    }