剑指offer之合并两个排序的链表

本文探讨了如何通过在单链表中引入头结点简化操作,并介绍了如何高效地合并两个有序链表,避免了首节点特殊处理。讲解了初始化链表和合并链表的具体实现,适用于初学者和进阶者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 链表的基本知识

链表是一种动态的存储结构,链表中每个结点的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单链表从空表开始,每读入一个数据则申请一个结点,然后插在链表的头部。

1、单链表的建立

在这里插入图片描述
第一个结点问题
“第一结点问题”的存在使得链表的插入、删除、等操作中需要考虑目标结点是不是第一个结点(操作不同),操作不便。因此,有时在链表的头部加入一个“头结点”,头结点类型与链表的数据结构类型一致,标识链表的头指针变量L中存放头结点的地址,这样即使是空表,头指针也不为空了。头结点的加入使得“第一个结点”的问题不复存在,也使得空表和非空表的处理一致。
头结点的数据域无定义,指针域中存放的是第一个数据结点的的地址,空表时为空。
在这里插入图片描述

问题:初始化,链表的初始化问题,不能直接申明吗?

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
    ListNode list0 = new ListNode(0);
    //保存头指针,投结点
    ListNode list = list0;
    //此时list和list0无区别,但是后续操作中list再不断指向下一个结点,此时的指针已不是头指针。
//     if (list1 == null && list2 == null){
//         return null;
//     }
    while (list1 != null && list2 !=null){
        if(list1.val<= list2.val){
            list.next = list1;
            list1= list1.next;
            //list = list.next;
        }else{
            list.next = list2;
            list2 = list2.next;
           // list = list.next;
        }
        list = list.next;
    }
        if(list1!= null)
            list.next = list1;
        if(list2!= null)
            list.next = list2;
        return list0.next;
        //返回第一个数据结点
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值