21. 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路很明确:
- 定义一个虚拟头节点把新的链表连接起来,同时定义一个temp节点记录链表的尾巴,找到小的就直接插入尾巴;
- 当两个链表都不空的时候进入循环,比较两个链表的对应位置上的val大小;
- 判断循环结束的原因是什么,l1空,还是l2空,或者都是空;
- 当l1空的时候,记得把l2连起来;
- 当l2空的时候,记得把l1连起来;
- 返回虚拟节点的下一个就是头节点。
code:
public ListNode mergeTwoLists(ListNode headA, ListNode headB) {
//定义一个虚拟头节点,不动
ListNode newHead = new ListNode(-1);
//往后动,相当于尾巴
ListNode temp = newHead;
//都不为空就进入循环,插进去
while (headA != null && headB != null) {
if (headA.val < headB.val) {
temp.next = headA;
headA = headA.next;
temp = temp.next;
}else {
temp.next = headB;
headB = headB.next;
temp = temp.next;
}
}
//如果headA空了,把headB剩下的插进来
if (headA == null) {
temp.next = headB;
}
//如果headB空了,把headA剩下的插进来
if (headB == null) {
temp.next = headA;
}
//返回虚拟节点的下一个节点
return newHead.next;
}