Leetcode21:合并两个有序链表

一、题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

复制代码
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

输入:l1 = [], l2 = []
输出:[]

输入:l1 = [], l2 = [0]
输出:[0]

二、题解

思路:分别用两个指针遍历两个链表,再用一个指针专门改变链表的指向。

一开始先找出头更小的那个链表作为头节点,依次取出两个指针指向的链表元素,谁小,就改变当前节点的指向,让当前节点始终指向更小的元素。两个指针一直前进,当指向为空时,遍历结束。

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }
        //头节点指针
        ListNode head;
        //操作链表1的指针
        ListNode cur1 = list1;
        //操作链表2的指针
        ListNode cur2 = list2;

        //比较两个链表的头节点谁小谁就作为新的头
        if (list1.val < list2.val) {
            head = list1;
            cur1 = list1.next;
        } else {
            head = list2;
            cur2 = list2.next;
        }
        ListNode pre = head;

        while (true) {
            //遍历完了list1,让pre直接指向list2
            if (cur1 == null) {
                pre.next = cur2;
                break;
            }
            //遍历完了list2,让pre直接指向list1
            if (cur2 == null) {
                pre.next = cur1;
                break;
            }
            int val1 = cur1.val;
            int val2 = cur2.val;

            if (val1 <= val2) {
                pre.next = cur1;
                pre = pre.next;
                cur1 = cur1.next;
            } else {
                pre.next = cur2;
                pre = pre.next;
                cur2 = cur2.next;
            }
        }
        return head;
    }
}
相关推荐
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
不知名XL11 小时前
day50 单调栈
数据结构·算法·leetcode
cpp_250113 小时前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250113 小时前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
TracyCoder12314 小时前
LeetCode Hot100(26/100)——24. 两两交换链表中的节点
leetcode·链表
季明洵14 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
only-qi14 小时前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250114 小时前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-14 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
爱吃生蚝的于勒14 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习