合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
Code
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//如果两个链表有一个为空,则返回不空的链表
if(l1==null||l2==null){
return l1==null?l2:l1;
}
//确定头结点,头结点为(l1,l1)中头结点值较小的链表。
ListNode head=l1.val<=l2.val?l1:l2;
//cur1表示作为头结点链表的头结点的下一个节点。
ListNode cur1=head.next;
//由于head是要保存下来,作为方法返回值的。所以将head的值赋值给pre,由pre进行逐个链接工作。
ListNode pre=head;
//cur2作为不是(头结点链表)的链表的头结点。
ListNode cur2=head==l1?l2:l1;
//当cure1和cure2都不为空时,进行值得比较。如果有一个为空,则直接将pre指针指向非空的剩余链表。
while (cur1!=null&&cur2!=null){
if(cur1.val<=cur2.val){
pre.next=cur1;
cur1=cur1.next;
}else {
pre.next=cur2;
cur2=cur2.next;
}
pre=pre.next;
}
//如果有一个为空,则直接将pre指针指向非空的剩余链表。
pre.next=cur1==null?cur2:cur1;
return head;
}
总结
1.关于链表的题, 首先要判断链表为空的情况,其次是保留head值,以返回。
2.关于链表的题,先在草稿纸上画明白流程,再写代码。