力扣面试150(48/150)
8.6 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
我的思路:我就打算新建一个链表了,然后用链表的指针来进行升序的排序
let ansHead = new ListNode;let l3 = ansHead;
然后进行遍历->两个相同的长度(&&)
哪个小就移动l3到哪个链表上,同时链表也要移动
while(list1 && list2){if(list1.val >= list2.val){l3.next = list2;list2 = list2.next;}else {l3.next = list1;list1 = list1.next;}l3 = l3.next;}
最后进行剩下的:l3移动+l3next移动+链表本身移动
while(list1){l3.next = list1;l3 = l3.next;list1 = list1.next;}while(list2){l3.next = list2;l3 = l3.next;list2 = list2.next;}
最后返回:
return ansHead.next;
易错点:在处理剩余节点的循环中,每次连接完节点后,记得把 l3 指针也向后移动一位。
我的总结:它通过创建一个哑节点作为新链表的起始点,然后使用一个循环同时遍历两个输入链表,在每次迭代中比较当前节点的值,将值较小的节点连接到新链表的末尾,并移动相应链表的指针。当其中一个链表遍历完毕后,再用两个独立的循环将另一个链表剩余的所有节点直接连接到新链表的末尾。最后,通过返回哑节点的下一个节点,得到了合并后有序链表的头节点。这个逻辑清晰且完整地实现了题目要求。