Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例
示例1:
输入: 1->2->4, 1->3->4
输出: 1->1->2->3->4->4
提示
- 0 <= 链表长度 <= 1000
难度:简单
此题为简单题,兄弟们可以重拳出击!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 合并两个排序的链表,已知两个脸吧均是递增有序的,需要将两个链表合并成为一个,并且合并得倒的链表仍然是递增有序的。
- 合并两个链表并保证最终是增序,可以使用操作流程为
- 初始化新的头结点作为最终合并的新链表的头结点
- 两个指针分别在两个链表中进行移动并判断大小
- 如果第一个链表结点较小,则将结点加入到新链表,指针前进 +1
- 如果第二个链表较小,则将第二个链表结点加入新链表,指针前进 +1
- 如果两个链表相等,则也将第一个链表结点加入,指针前进 +1
- 最后当有一个链表到达末尾时,剩下链表的所有值有序且更大,只需要将其链接在新链表之后即可
- 由于新链表头结点是自定义的,因此最后需要返回新结点的 next 指针结点
三、AC 代码
双指针解决
- 两个指针分别指向两个链表,谁小谁移动,相等第一个移动,新的节点指向合并后的链表头
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode cur1 = l1, cur2 = l2, curNew = head;
while(cur1 != null && cur2 != null){
if(cur1.val <= cur2.val){
curNew.next = cur1;
cur1 = cur1.next;
}else{
curNew.next = cur2;
cur2 = cur2.next;
}
curNew = curNew.next;
}
if(cur1 != null) curNew.next = cur1;
if(cur2 != null) curNew.next = cur2;
return head.next;
}
四、总结
知识点
- 双指针,两个指针分别在两个结点中移动
- 使用新的头结点接收合并的链表
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。