Sword25——合并两个排序的链表
方法1——哑铃节点
- 思路:因为是两个有序的链表,可以采取类似于归并排序的思想,首先定义新链表的哑铃节点,依次遍历两个链表中节点,将较小的节点加入新链表中,并后移,直到两个链表合并完毕
- 特殊情况与临界分析:无
- 终止条件:两链表合并完毕
- 步骤:
- 定义新链表的哑铃节点
- 定义记录新链表的末尾节点
- 循环条件:l1且l2不为空
- while循环
- 当l1对应节点值小于l2时
- 新链表末尾节点的next指向l1
- l1后移
- 末尾节点后移(公共部分抽取成一个步骤)
- 当l1对应节点值大于等于l2时
- 新链表末尾节点的next指向l2
- l2后移
- 末尾节点后移(公共部分抽取成一个步骤)
- 末尾节点后移(两个判断都要执行此步骤)
- 退出循环时,代表链表一方为空,因此将另一方不为空的后续拼接在末尾节点后面即可
- 返回哑铃节点的下一节点,即新链表的头节点
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode end = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
end.next = l1;
l1 = l1.next;
} else {
end.next = l2;
l2 = l2.next;
}
end = end.next;
}
end.next = l1 == null ? l2 : l1;
return dummy.next;
}