LeetCode
No.21合并两个有序列表
题目:
将两个升序链表合并为一个新的 升序 链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
分析
-
创建一个带头节点的新链表
-
while
循环第一步遍历两个链表 -
针对每一次循环
- 如果每一次两个节点都有数据
- 将较小值储存到新链表中
- 较小值所在的节点指针指向,向后一位
- 如果某一个节点为空,一个不为空
- 将非空节点数据添加到新链表
- 非空链表指针指向后移一位
- 两个均为空
- 遍历结束
- 返回
- 如果每一次两个节点都有数据
图示:
下面的图最后两张中间跳过了一步
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//头节点为-1
ListNode head = new ListNode(-1);
//cur代表当前节点
ListNode cur = head;
//遍历两个链表
while((l1 != null) || (l2 != null)){
//创建一个节点,储存数据
cur.next = new ListNode();
cur = cur.next;
//如果l1遍历到最后了,为空
if (l1 == null){
那么直接储存l2的值
cur.val = l2.val;
l2 = l2.next;
}
//同理
else if (l2 == null){
cur.val = l1.val;
l1 = l1.next;
}
//常规情况,l1,l2不为空
//比较两个链表第一个数,储存较小的,并在原链表中删除该数
//下次依旧比较原数据的第一个数据
else {
if (l1.val > l2.val){
cur.val = l2.val;
l2 = l2.next;
}
else{
cur.val = l1.val;
l1 = l1.next;
}
}
cur.next = null;
}
return head.next;
}
}