合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路+代码+注释:
/**
* 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) {
/*
思路:直接遍历两个有序链表的节点,进行比较,较小的节点插入到新链表中,直到某个链表为空为止
不为空的链表的节点直接遍历剩余节点,插入到新链表中
*/
//如果l1为空直接返回l2
if (l1==null)
{
return l2;
}
//如果l2为空直接返回l1
if (l2==null)
{
return l1;
}
ListNode head=null;
int index=1;
//记录前一个节点
ListNode beforeNode=null;
while (l1!=null && l2!=null)
{
if (l1.val<=l2.val)
{
//第一个节点设置为头节点
if (index==1)
{
head=l1;
index++;
}
//判断是否有前一个节点,如果有拼接到前一个节点后
if (beforeNode!=null)
{
beforeNode.next=l1;
}
//当前节点作为下一个节点的beforeNode前一个节点
beforeNode=l1;
//往后遍历
l1=l1.next;
}else {
//第一个节点设置为头节点
if (index==1)
{
head=l2;
index++;
}
if (beforeNode!=null)
{
beforeNode.next=l2;
}
beforeNode=l2;
l2=l2.next;
}
}
//l1不等于null,证明l1链表还有剩余节点,l1节点就是剩余节点的第一个节点,直接拼接在新链表后即可
if (l1!=null)
{
beforeNode.next=l1;
}
//l2和l1同理
if (l2!=null)
{
beforeNode.next=l2;
}
return head;
}
}