解题思路:
以升序为例
第一步当然是判空 如果其中一个链表为空 则返回另一个链表即可
要有序 所以需要比较结点大小 创建两个引用指向两个链表 同时分别创建将要合成链表的头和尾
比较两个结点的大小 将较小的结点 cur 放到新的链表尾部
此时要考虑特殊情况 当新链表为空时 要把头和尾都设置成 cur 同时 cur 向后移
新链表不为空时将 cur 放到尾部 同时 newTail 和 cur 向后移
最后再处理循环结束时 一个链表为空 另一个不为空的情况 直接将非空链表并到新链表尾部即可
//将两个有序链表合并为一个新的有序链表(升序为例)
public ListNode conflateList(ListNode head1,ListNode head2) {
//先进行判空
if (head1 == null) {
return head2;
}
if (head2 == null) {
return head1;
}
//设置两个引用分别指向两个链表
ListNode cur1 = head1;
ListNode cur2 = head2;
//设置将要合成的链表的头和尾
ListNode newHead = null;
ListNode newTail = null;
//两个链表任何一个为空循环就终止
while (cur1 != null && cur2 != null) {
if (cur1.val <= cur2.val) {
if (newHead == null) {
//当新链表为空时
newHead = cur1;
newTail = cur1;
cur1 = cur1.next;
}
//新链表不为空时
newTail.next = cur1;
newTail = newTail.next;
cur1 = cur1.next;
} else {
if (newHead == null) {
newHead = cur2;
newTail = cur2;
cur2 = cur2.next;
}
newTail.next = cur2;
newTail = newTail.next;
cur2 = cur2.next;
}
}
//循环终止之后 把还剩有结点的链表并到新链表尾部即可
if (cur1 == null) {
newTail.next = cur2;
} else {
newTail.next = cur1;
}
return newHead;
}