1.题目: (合并两个有序链表)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
2. 示例
3.解答步骤
思路都在注释上! 请大家自主阅读程序!
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 创建一个需要返回的链表
ListNode resHead = new ListNode(0);
// 创建一个用于拼接的链表
ListNode nodeTemp = resHead;
// 判断初始链表有没有空链,有的话直接返回另一个链表
if(l1 == null)
return l2;
if(l2 == null)
return l1;
// 如果初始链表没有空链表的话 进行拼接的操作
// 当出现其中一个链表的元素已经完全拼接进去的时候
// 终止循环,在最后将另一个链表剩余部分接到返回链表中
while(l1 != null && l2 != null) {
// 两个链表谁的数小谁拼接到 返回链表中
if(l1.val <= l2.val) {
nodeTemp.next = l1;
l1 = l1.next;
}else {
nodeTemp.next = l2;
l2 = l2.next;
}
// 到程序这里
// 表示已经在两个链表中的一个找到一个小数
// 并拼接到返回链表中了,返回链表要到下一个位置了,存储下一个比较的数
// nodeTemp要指向下一个元素了
nodeTemp = nodeTemp.next;
}
// 循环结束的时候表示已经出现至少一个链表结束了,此时我们通过三目运算
// 将另一个链表拼接到这个链表即可
// 因为当程序终止时,nodeTemp是保存的数据的
// 所以 nodeTemp的指向为 不空的链表的剩余部分
nodeTemp.next = l1==null?l2:l1;
// 最后返回头指针即可
// 因为我们第一次添加到的数据是 resHead.next
// 也就是第一个nodeTemp.next
return resHead.next;
}
}