剑指 Offer 25. 合并两个排序的链表

199 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例

示例1:

输入: 1->2->4, 1->3->4
输出: 1->1->2->3->4->4

提示

  • 0 <= 链表长度 <= 1000

难度:简单

此题为简单题,兄弟们可以重拳出击!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 合并两个排序的链表,已知两个脸吧均是递增有序的,需要将两个链表合并成为一个,并且合并得倒的链表仍然是递增有序的。
  2. 合并两个链表并保证最终是增序,可以使用操作流程为
    • 初始化新的头结点作为最终合并的新链表的头结点
    • 两个指针分别在两个链表中进行移动并判断大小
    • 如果第一个链表结点较小,则将结点加入到新链表,指针前进 +1
    • 如果第二个链表较小,则将第二个链表结点加入新链表,指针前进 +1
    • 如果两个链表相等,则也将第一个链表结点加入,指针前进 +1
  3. 最后当有一个链表到达末尾时,剩下链表的所有值有序且更大,只需要将其链接在新链表之后即可
  4. 由于新链表头结点是自定义的,因此最后需要返回新结点的 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;
}

image.png

四、总结

知识点

  • 双指针,两个指针分别在两个结点中移动
  • 使用新的头结点接收合并的链表

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。