/**
* 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) {
ListNode prevNode = new ListNode(-1);
ListNode prev = prevNode;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
prevNode.next = l1;
l1 = l1.next;
}else{
prevNode.next = l2;
l2 = l2.next;
}
prevNode = prevNode.next;
}
prevNode.next = l1 == null ? l2 : l1;
return prev.next;
}
}
思路:
先创建一个虚拟头结点,再创建一个节点对象指向这个虚拟头结点,虚拟头结点所在的链表则是新的有序链表
当l1不为空且l2也不为空时{
判断:
如果l1的value小于l2的value
让虚拟头结点的next指向l1,接着l1顺移指向l1.next
其他情况下(即l1.value <= l2.value)
让虚拟头结点的next指向l2,接着l2顺移指向l2.next
做完上述任一操作后,让虚拟头结点顺移指向它的next
}
为了能遍历完至少一个链表,应该给上述条件加一个循环的条件,让其循环执行
跳出上述循环的条件有三种
1.l1为空
2. l2为空
3. l1且l2都为空
因为l1和l2都为有序链表,所以在1和2的情况下,剩下的非空的链表中的剩余元素都比新有序链表的元素大,且都是有序的
所以直接把新有序链表的尾部接上剩下的非空的链表中的剩余元素
第三种情况,让其尾部指向null,因为都为空即l1和l2的元素数量相同且所有元素都已加入新的有序链表中了
最后返回指向这个虚拟头结点的节点对象的next,即新有序链表的头部