新手小白,初刷LeetCode,与大家分享做题的日常....
本题连接如下:
本题是一道关于链表的算法题,在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]
示例 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;
}
}
大致思路:
首先先创建一个链表,此链表便于后续扩充.
用函数拿到两个链表, 比较链表第一个数值大小情况, 由于要求是递增有序,所以选择小者插入到原始链表中,然后将指针都后移,重复操作,最后由于其中一个链表空了,导致跳出循环,那我们就把另一个没有空的链表全插入到总链表中,从而完成扩充!