LeetCode _Java_eazy_21.合并两个有序链表

新手小白,初刷LeetCode,与大家分享做题的日常....

本题连接如下:

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M276https://leetcode-cn.com/problems/merge-two-sorted-lists/

本题是一道关于链表的算法题,在Java中,链表的实现不像C语言那样可以构造结构体,在Java中,当然要符合面向对象的思想,即用类去构造.

 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }

对于链表而言,我们要清楚它的结构:

链表包括: value域 和 next域

题目要求是合并两个有序的单链表为一个有序的单链表

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

                          LeetCode _Java_eazy_21.合并两个有序链表_第1张图片


示例 2:

输入:l1 = [], l2 = []
输出:[]


示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

(以上示例为LeetCode官网提供)

题解代码

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 
        // 使用带头结点的链表解决问题
        // 待输出链表的头部
        ListNode head = new ListNode(); //创建一个链表对象,用于存贮最终链表

        // 待输出链表的 last 结点
        ListNode last = head;
        while(l1 != null && l2 != null) { // 当传入的两个链表都不为空时
            if(l1.val > l2.val) {
                last.next = l2;  // 将l2 链接到总链表上
                l2 = l2.next;    // l2去掉上一个节点
            }else{
                last.next = l1;  // 将l1 链接到总链表上
                l1 = l1.next;    // l1去掉上一个节点
            }
            last = last.next;   // 将指针调整到总链表头节点的下一个,继续循环
        }

        // l1 或 l2 可能还有剩余结点没有合并, 
        // 由于从上面的 while 循环中退出, 那么链表 l1 和 l2 至少有一个已经遍历结束
        if(l1 != null) last.next = l1; 
        if(l2 != null) last.next = l2;
        // 剩余链表插入到总链表中,完成构造
        
        return head.next;

    }
}

大致思路:

首先先创建一个链表,此链表便于后续扩充.

用函数拿到两个链表, 比较链表第一个数值大小情况, 由于要求是递增有序,所以选择小者插入到原始链表中,然后将指针都后移,重复操作,最后由于其中一个链表空了,导致跳出循环,那我们就把另一个没有空的链表全插入到总链表中,从而完成扩充!

你可能感兴趣的:(LeetCode_Java,java,算法,链表,leetcode)