将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
该题目来自力扣题库
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
设立一个新链表,选择带有头节点是傀儡节点的新链表代码书写起来较为简便。
设一个新链表的尾节点,这个尾节点就用于在新链表尾部插入节点所用。
循环遍历 l1 链表和 l2 链表,判断大小后对应添加到新链表的尾部,循环结束的条件是 遍历 l1链表或者 l2 链表到了末尾,那么就退出循环。
判断哪个链表还没有遍历完成,没有遍历完成的就把剩下的节点一齐加入到新链表末尾。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
//设置一个傀儡节点
ListNode newHead=new ListNode(-1);
//cur1和cur2分别遍历l1和l2链表
ListNode cur1=l1;
ListNode cur2=l2;
//新链表的尾部
ListNode newtail=newHead;
while(cur1!=null&&cur2!=null){
if(cur1.val<=cur2.val){
newtail.next=cur1;
cur1=cur1.next;
}else{
newtail.next=cur2;
cur2=cur2.next;
}
newtail=newtail.next;
}
//哪个不为空,就把哪个链表剩下的所有节点尾插到新链表结尾
if(cur1!=null){
newtail.next=cur1;
}
if(cur2!=null){
newtail.next=cur2;
}
return newHead.next;
}
}